2014-02-25 279 views
0

我是新來的python,我有這個代碼應該打印所有使用嵌套循環小於50的素數的一些問題。素數python嵌套循環

下面是代碼:

i = 2 
while(i < 50): 
    j = 2 
    while(j <= (i/j)): 
      if not(i%j): 
       break 
      j = j + 1 
      if (j > i/j): 
       print(i, " is prime") 
    i = i + 1 

它的輸出是:

2 is prime 
3 is prime 
5 is prime 
7 is prime 
11 is prime 
13 is prime 
17 is prime 
19 is prime 
23 is prime 
29 is prime 
31 is prime 
37 is prime 
41 is prime 
43 is prime 
47 is prime 

所以3後,J應該是2,我應該是4,那麼這不是一個素數,所以它回到while循環。

過程重新開始。我和我應該增加一個。所以j應該是3,我應該是5,5是素數,然後它又增加到6.

所以j應該仍然是3,我應該是6.但是(3 < =(6/3))< - 這是不正確的,所以如果語句和3是j大於2即i/j,這意味着6應該是質數。

但事實並非如此。你可以通過常識來判斷。我想知道我在這裏做錯了什麼。我在這裏錯過任何增量嗎?謝謝。

+0

鑑於你的程序產生了正確的輸出,所以你不完全清楚爲什麼你認爲有什麼錯誤。請詳細說明。 – NPE

+0

是的,我知道程序是正確的,輸出是正確的,但我想弄清楚我在想什麼錯*。 – James

+1

哦,我明白了。你爲什麼不重新格式化敘述,以便:(1)每行有一個操作; (2)每行會顯示你認爲'i'和'j'的結果值是什麼。這會讓你的敘述更容易遵循(甚至可能幫助你找到問題)。 – NPE

回答

0

首先,我想發佈代碼的正確語法。

i = 2 
while(i < 50): 
     j = 2 
     while(j <= (i/j)): 
      if not(i%j): 
       break 
      j = j + 1 
      if (j > i/j): 
       print(i, " is prime") 
     i = i + 1 

通過編寫這樣的代碼,我們可以做幾件事情。我們能夠做的第一件事是獲得一個很好的視覺內容,而不是假設什麼。我們能夠做的第二件事是看看遞增在哪裏。

現在讓我們來看看這段代碼裏面發生了什麼。首先要認識到的是,我們從i = 2開始。我們正在初始化一個while循環,當我大於50時,它將停止。

所以,現在我們在第一個while循環內,接下來我們要做的是調用j。我們可以看到,這個變量等於2。它不僅等於2,而且每當我們回到第一個循環的底部時,當i> = 50時,我們返回到開始並重新初始化j再次爲2。

這意味着即使我們在第二個(嵌套)while循環中添加j,j也不會開始爲兩個。

如果我能理解你的問題,那麼從這裏開始的一切都應該是有意義的。這是奇怪這個代碼,在我看來,唯一的事情是:

if not (i%j) 

這似乎有點奇怪,因爲它將如果說是增加文書:如果您有任何

if (i%j == 0): 
     break 

其他問題,請隨時詢問。如果你覺得這個有幫助,可以隨意接受它作爲你的回答:)

+0

我認爲,如果不是(i%j)意味着如果i%j爲0,這意味着如果不是(i%j),這意味着它是平等分配的,而不是餘數。那麼,對我而言,你寫的更有意義,但兩者都適合我。我明白。謝謝你,我知道我在想什麼錯。 – James

0

縮進代碼如下。

i = 2 
while(i < 50): 
    j = 2 
    while(j <= (i/j)): 
     if not(i%j): 
      break 
     j = j + 1 
    if (j > i/j) : 
     print(i, " is prime") 
    i = i + 1 

在你的代碼,j是越來越初始化爲2的i每一個增量。
看到這個片段if not(i%j): break
如果任何ji,則if not(i%j)成爲true和循環中斷,但j <= (i/j)仍持有其他控制,將不會進入這個循環。所以控制跳過print(i, " is prime")

所以只有這樣if(j > i/j)變成true是上面的循環永不休息。這將意味着i沒有得到任何除數,因此i是一個主要因素。

+0

也謝謝你。 – James