以下是生成素数nos的代码:
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循环获得所需的结果。
发布于 2015-11-09 07:41:06
您的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我真的建议你用一个比一个单独的空间更大的缩进来观察这些问题。当每件事都是如此的缩进时,它们是很难辨认的。
发布于 2015-11-09 07:49:02
您需要重置您的内部标志和计数器:
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使用布尔标志也更好,而不是使用字符串。它的可读性更强,您不需要为字符串操心。
https://stackoverflow.com/questions/33604242
复制相似问题