我正在尝试获取一个函数来确定N是否为素数。我是Python新手,我知道这可能不是解决这个问题的最有效方法,但这是我的尝试
def is_prime(N):
k = [] #Creates a new list k
for i in range(2,N): #For each i from 2 -> N
r = N%i # r is the remainder of N % i
k.append(r) # appends each remainder r to list k
if (i == N-1): #Once index equals N-1, print list k
print(k)
#For each element j in list k, check if each element in list k is 0
for j in range (len(k)):
if k[j] != 0: <---PROBLEM
return True
else:
return False
print(is_prime(15))
我所拥有的逻辑是,当一个数字可以被1和它自身整除,并且不能被2到N-1的任何其他数字整除时,那么它就是素数。在上面的代码中,我无法比较列表k中每个元素的值。我想确定每个元素的值是否为k [j] == 0.如果每个元素k [j]!= 0 和 N%1 == 0 和 N%N == 0,那么它是素数!
有关如何解决此问题的任何想法?请参考以下链接以获取我的代码的可视化! http://goo.gl/IVIRz7
答案 0 :(得分:2)
我建议解决如下:
def is_prime(n):
i = 2
while (i * i <= n):
if (n % i == 0):
return False
i += 1
return True
此代码适用于n >= 2
。
答案 1 :(得分:2)
import math
def is_prime(n):
i = 3
while (i <= math.sqrt(n)):
if (n % i == 0):
return False
i += 2
return True
这是最好的。上面的每个人都提到了它的变化。
答案 2 :(得分:0)
上述答案可行,但我想我会解释你的逻辑错误。你的英语推理是合理的,如果[2,N-1]之间的任何数字均分N,那么你就找到了一个非素数。
for j in range (len(k)):
if k[j] != 0:
return True
else:
return False
如果k中的第一个数字为0,则此循环检查的实际情况。如果它非零,则该数字不会均匀地除N(注意这并不意味着其他数字均匀地划分n),因此该数字仍然可以可能为素数,但仅在余数为其余潜在除数的非零值。换句话说,你可以在看到余数为0时立即返回False,但只有当所有除数具有非零余数时才能返回True。
修正:
for j in range (len(k)):
if k[j] == 0:
return False
return True
返回True语句仅在我们设法在循环中完成而不返回False时执行。