我正在尝试将所有素数的列表返回到一定数量(如果是项目欧拉问题7,则为此)。我是Python的新手,但我的问题似乎不是语言,而是逻辑错误。
import math
import sys
def is_prime(n):
if n%2 == 0:
return False
for i in range(3, int(math.sqrt(n))+1, 2):
if n%i == 0:
return False
return True
def prime_counter(n):
result = [2]
while len(result) < n:
for i in range(3, sys.maxsize, 2):
if is_prime(i):
result.append(i)
break
return result
print (prime_counter(6))
打印[2,3,3,3,3,3]。为什么不增加i并将新数字评估到列表中?为什么一直加3?
答案 0 :(得分:3)
每次找到第一个素数(3)时,break
语句都会在函数for
中退出prime_counter
循环。然后它从头开始重新启动for
循环,从数字3开始,它再次发现是一个素数。
例如,你需要使用一个while
循环并自己递增候选变量,然后在找到足够的素数时打破循环。
答案 1 :(得分:1)
摆脱while循环,相反,测试每个新发现的素数的var myText = txt_field.getText();
if(myText != null && myText.length > 15) {
// do stuff
}
的长度:
result
答案 2 :(得分:0)
您的休息声明似乎是个问题。在for循环的第一个循环中,设置i = 3,确认i小于sys.maxsize,然后检查i是否为素数。它是,所以我们做if语句的主体。它将i追加到您的结果集,然后突破for循环。请注意,我们永远不会回到for循环的顶部,在那里我将增加2.我们在3处离开。在断开for循环之后,我们检查while语句的条件,并确认长度为结果集仍然小于n,所以我们重新开始for循环,从3开始,检查3是否小于sys.maxsize等。你永远不会到处增加i。
而不是双循环,你应该只使用for循环,并在每次成功追加后,然后检查结果集的新长度是否等于n,如果是,则跳出循环。完全摆脱while循环。
祝你好运!