我正在尝试运行以下简单代码:
import math
def is_prime(N):
for i in range(2, int(math.sqrt(N))):
if (N % i == 0) :
print(str(N) + " is not prime")
return False
print(str(N) + " is prime")
return True
目标是确定数字是否为素数(非常简单)。但是,我无法使用此代码。我已经设法查明int(math.sqrt(N))
指令周围的问题,但我不明白为什么它不起作用,因为运行int(math.sqrt(134))
例如适用于我。我在这段代码中看不到有什么问题吗?
我也开始质疑编译器的可行性。我使用Sublime Text 3和默认的Python Builder。也许我正在做的事情在Sublime Text上特别错误?
编辑:忘了提问题。例如,当我运行is_prime(8)
时,它会返回8 is prime
。但它根本不显示任何错误。但是,应该注意的是,按预期运行is_prime(134)
会打印134 is not prime
。如果有人想要,我可以尝试for
循环。
答案 0 :(得分:1)
试试这个:
import math
def is_prime(n):
for i in range(2, int(math.sqrt(n))+1):
if n%i == 0 :
return False
return True
range()
在实际到达第二个数字之前停止。在这种情况下,您也想测试该数字,因此您想要向下舍入,然后添加一个。
更高效的版本(x10 - x1000
速度提升):
def memoise(func):
memory = {}
def wrapper(n):
if n in memory:
return memory[n]
ret = func(n)
memory[n] = ret
return ret
return wrapper
@memoise
def is_prime(n):
if n <= 3:
return n > 1
if not n%2 or not n%3:
return False
for i in range(5, int(n**0.5)+1, 6):
if not n%i or not n%(i+2):
return False
return True
在翻译中玩:
>>> math.sqrt(8)
2.8284271247461903
>>> int(math.sqrt(8)) + 1
3
>>> for i in range(2, 2):
print(i)
>>> for i in range(2, 3):
print(i)
2
答案 1 :(得分:1)
我重写了程序中的一些行,使其更有效率。 你的for循环迭代所有数字直到N的根。如果你从检查数字%2 == 0开始,你可以排除所有偶数,只检查奇数3,5,7,...
import math
def is_prime(N):
if(N == 2):
print(str(N) + " is a prime")
return True
if((N % 2 == 0)or(N == 1)):
print(str(N) + " is not prime")
return False
for i in range(3,int(math.sqrt(N))+1,2):
if(N % i == 0):
print(str(N) + " is not prime")
return False
print(str(N) + " is prime")
return True