【问题标题】:check if integer is a prime, if not return smallest factor [closed]检查整数是否为素数,如果不是则返回最小因子
【发布时间】:2020-08-12 10:19:48
【问题描述】:

我需要检查给定的整数是否是素数,如果是则返回 True。如果没有,我需要找到大于 1 的最小因子。我对此完全陌生,即使代码编译它也失败了几个测试用例。

def isPrime(n):
  if (n <= 1) : 
    return n
  if (n <= 3) : 
    return 1

if (n % 2 == 0 or n % 3 == 0) : 
    return 2

i = 5
while(i * i <= n) : 
    if (n % i == 0 or n % (i + 2) == 0) : 
        return i
    i = i + 6

return True

【问题讨论】:

标签: python math primes


【解决方案1】:

素数是一个只能被一和它自己整除的数。所以,如果我们测试x,我们应该测试每个数字y,这样1 &lt; y &lt; x。测试这一点的一个好方法是使用 for 循环。这是一个例子:

def isPrime(n):
    for i in range(2,n):
        if n % i == 0:
            return False # because that means that something divides into n perfectly
    return True

这有几个问题:

  • isPrime(1) 返回True
  • 任何负数都将返回True
  • 随着数字变大,程序变得相当慢。例如,完成isPrime(1000003) 需要 0.145 秒,但处理素数需要更长的时间,因为一旦找到一个因子,整个函数就会停止并返回,而要找到素数,它必须遍历每个迭代到n

我暂时把这些问题留给你。同时,我们需要一种返回最小因子的方法。这实际上很容易做到:

def isPrime(n):
    for i in range(2,n):
        if n % i == 0:
            return i # i at this iteration is equal to the smallest factor
    return True
 

所以isPrime(20) 返回2,而isPrime(19) 返回True。希望这能满足您的需求。

【讨论】:

  • isPrime(20) 也返回 True,因为 2 的计算结果为 True
  • 你确定吗? Here 是该函数的在线链接,它的输出为2,这是最低的因子,不包括 20 中的 1。也许您在尝试重现上述代码时出现了格式错误或其他问题?请告诉我。
  • 所以你认为是网上的东西一定是正确的?如果您正在测试 isPrime() 方法的输出,例如if isPrime(i): print("True") 那么 isPrime(20) 和 isPrime(19) 都会导致 "True" 被打印出来。
  • 不,我在网上写了这个函数来给你看。但我误读了你的评论,我很抱歉。也许它应该返回False, i,而不是返回最低因子。由用户决定,具体取决于他们需要该功能做什么。
  • 是的,那将是一个很好的选择,如果是最重要的,可能是True, NoneTrue,0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2017-09-17
  • 2022-11-18
相关资源
最近更新 更多