单独使用 while 循环的素数生成器的逻辑错误

Logical error for prime number generator using while loops alone

以下是生成素数的代码:

to_num=int(raw_input("Enter till where u wish to generate prime nos > "))

i=2
flag="prime"
j=2
while i <= to_num:

 while j<i:

  if i%j == 0:
   flag="nprime"
   break
  else:
   flag="prime"


 if flag=="prime":
  print "%d is  prime"%i


  j+=1
 i+=1

然而生成的结果并不如预期,例如:

Enter till where u wish to generate prime nos > 10
2 is  prime
3 is  prime
4 is  prime
5 is  prime
6 is  prime
7 is  prime
8 is  prime
9 is  prime
10 is  prime

你能指导我哪里出错了吗?

P.S:使用for循环获得所需结果。

你的 for 循环看起来像这样:

for i in range(2, to_num+1):
    for j in range(2, i):
        …

但是你的 while 循环看起来像这样:

i = 2
j = 2
while i <= to_num:
    while j < i:
        …
        j += 1
    i += 1

所以你永远不会在循环完成后将 j 重置回 2。您应该在外部循环的开头添加一个 j = 2 以使 while 循环等同于 for 循环:

i = 2
while i <= to_num:
    j = 2
    while j < i:
        …
        j += 1
    i += 1

最后请注意,您希望在 每次迭代 中递增 j。在您问题的代码中,您将 j += 1 作为 if flag=="prime": 的一部分,因此它只会增加 j 的质数。相反,您需要将增量向上移动到 while 循环中:

i = 2
while i <= to_num:
    j = 2
    while j < i:
        # the prime check here
        j += 1

    if flag == "prime":
        print "%d is  prime" % i

    i += 1

我真的建议您使用比 一个 space 更大的缩进,以便您自己查看这些问题。当一切都缩进得如此相似时,他们很难被发现。

您需要重置内部标志和计数器:

to_num=100

i=2
is_prime=False
j=2
while i <= to_num:
 is_prime=True // you need to reset your inner flags
 j=2 // set j to starting value
 while j<i:

  if i%j == 0:
   is_prime=False
   break

  j+=1

 if is_prime==True:
   print (i)

 i+=1

最好使用布尔标志,而不是字符串。它更具可读性,您不需要为字符串操心。