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

时间:2015-11-09 07:25:15

标签: python for-loop primes

以下是生成素数的代码:

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循环获得所需的结果。

2 个答案:

答案 0 :(得分:3)

你的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

我建议您使用比单个空格更大的缩进,以便自己查看这些问题。当所有内容都缩进时,它们很难被发现。

答案 1 :(得分:0)

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

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

使用布尔标志而不是字符串也更好。它更具可读性,你不需要打扰String。