我在这段代码中得到了几个不正确的答案。例如,9显示为素数。我猜我的问题是使用休息时间,但我似乎无法逻辑地弄清楚有人问我这个简单代码有什么问题。
for number in range(0, 1000):
for x in range(2, number):
if (number % x == 0):
break
else:
print x
break
答案 0 :(得分:4)
在你的脚本中,无论数字是否可以被2除,它都会立即打破循环。 我重新缩进了代码,这可能更接近你想要做的事情。
在原始代码中,如果数字可以被2 整除(range(2,number)
中的第一个数字,那么你就会打破循环,如果它不可分割你也打破了循环。所以所有奇数,如9,看起来像素数。
运行else
循环后的for
关键字 iff 循环正常退出。因此,只有在没有找到除数的情况下才会打印“是素数”部分。
for number in range(0,1000):
for x in range(2,number):
if(number % x == 0):
print number,"divisible by",x
break
else:
print number, "is prime"
你可以在这里看到这是一个动作:http://codepad.org/XdS413LR
此外,这是一个天真的算法(不是对代码的批评,探索简单的算法是一个有用的研究),但你可以提高一点效率。从技术上讲,你只需要检查number
的sqare根,因为任何大于平方根的数字必须有一个小于平方根的补数,这应该是已经遇到过的。因此代码中的逻辑可以更改为:
from math import sqrt
for number in range(0,1000):
for x in range(2,int(sqrt(number/2))):
# Rest of code as above.
这就是说,如果有机会,有很多方法可以优化检查或发现值得调查的素数。
答案 1 :(得分:1)
我想你想要这样的东西:
for number in xrange(100):
for i in range(2,number):
if number % i == 0:
break
else:
print number
这会遍历每个数字形式1-100,并检查是否有任何数字可被任何#整除,但是你需要内部for循环的else:
语句,所以如果它通过内部for循环没有找到一个除数它的主要
答案 2 :(得分:1)
以下是一些替代方案。首先,这会检查素数:
def check_for_prime(n):
if n == 1: return False
elif n == 2: return True
elif n%2 == 0: return False
# Elementary prime test borrowed from oeis.org/A000040.
odds = 3
while odds < n**.5+1:
if n%odds == 0: return False
odds += 2
return True
这稍快一点,但您应该有使用yield的经验:
def primes_plus():
yield 2
yield 3
i = 5
while True:
yield i
if i % 6 == 1:
i += 2
i += 2
答案 3 :(得分:1)
以下是一些替代方案。
n是您想要找到的范围之前的数字
n=100
for i in range(0,n):
num = filter(lambda y :i % y == 0,(y for y in range(2,(i/2))))
if num or i == 4:
print "%s not a prime number" %(i)
else:
print "%s is a prime number" %(i)