Python和模数运算符的数字非常大

时间:2014-05-09 22:59:49

标签: python primes modulus

如果这是一个重复的问题,我会提前道歉 - 我对pythonmodulus的搜索最多会出现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 }})。为什么会这样?

编辑:正如roippi所指出并经我的进一步调查证实,这个函数实际上并不适用于很多较小的奇数复合数。我想弄清楚为什么现在不起作用。

2 个答案:

答案 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