首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单循环使用素数发生器的逻辑错误

单循环使用素数发生器的逻辑错误
EN

Stack Overflow用户
提问于 2015-11-09 07:25:15
回答 2查看 85关注 0票数 1

以下是生成素数nos的代码:

代码语言:javascript
复制
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

然而,所产生的结果并不如预期的那样,例如:

代码语言:javascript
复制
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循环获得所需的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 07:41:06

您的for循环如下所示:

代码语言:javascript
复制
for i in range(2, to_num+1):
    for j in range(2, i):
        …

但您的while循环如下所示:

代码语言:javascript
复制
i = 2
j = 2
while i <= to_num:
    while j < i:
        …
        j += 1
    i += 1

因此,在循环完成后,您永远不会将j重置为2。您应该在外部循环的开头添加一个j = 2,以便使while循环等效于for循环:

代码语言:javascript
复制
i = 2
while i <= to_num:
    j = 2
    while j < i:
        …
        j += 1
    i += 1

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

代码语言:javascript
复制
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

我真的建议你用一个比一个单独的空间更大的缩进来观察这些问题。当每件事都是如此的缩进时,它们是很难辨认的。

票数 3
EN

Stack Overflow用户

发布于 2015-11-09 07:49:02

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

代码语言:javascript
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33604242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档