如果这是一个重复的问题,我会提前道歉 - 我对python
和modulus
的搜索最多会出现8页问题,加上我相对较少的编码经验对我来说有点困难彻底检查一下是否有类似的东西。
在尝试解决Project Euler问题时,我编写了一个函数来测试数字是否为素数:
import math
def isprime(n):
if n % 1 != 0:
return(False)
else:
for j in range(2, math.ceil(math.sqrt(n)) + 1):
if n % j == 0:
return(False)
else:
return(True)
break
这适用于小数字,但是非常大的数字肯定不是素数(例如我放入isprime(1012321312412431434334545555)
并且函数给我的值为{{1 }})。为什么会这样?
答案 0 :(得分:1)
我相信你的问题是回归是在错误的地方。你的代码目前只循环遍历2,任何奇数显然不能被2整除。因此,它进入if n%j == 0,返回True,并且由于返回突破循环,停止运行。所以,任何奇数都会返回True。
相反,请尝试:
def isprime(n):
if n % 1 != 0:
return True
else:
for j in range(2, math.ceil(math.sqrt(n))):
if n % j != 0:
return False
return True
我认为这很有效。 编辑:不,它实际上并没有。在这里,我将发布一个不同的主要检查器:
def isprime(n):
'''check if integer n is a prime'''
n = abs(int(n))
if n < 2:
return False
if n == 2:
return True
if not n & 1:
return False
for x in range(3, int(n**0.5)+1, 2):
if n % x == 0:
return False
return True
答案 1 :(得分:1)
首先,n % 1 == 0
将始终为整数返回true,因为这会测试n是否可被1整除。所以这是一个非常规的测试。如果要检查奇数/偶数,请使用n % 2
。
检查小数,但在这种情况下,我认为最好抛出错误。
测试素数的更好算法是这样的:
def isPrime(n):
if n < 2:
return False
if n < 4:
return True
for x in range(2,ceil(sqrt(n)) + 1):
if (n % x == 0):
return False
return True