【问题标题】:Python and the modulus operator with very large numbersPython和具有非常大数字的模运算符
【发布时间】:2014-05-09 22:59:49
【问题描述】:

如果这是一个重复的问题,我提前道歉 - 我搜索 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),该函数给我一个值True)。为什么会这样?

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

【问题讨论】:

  • 您的函数认为15 是素数。调查一下,你就有答案了。
  • 如果我测试 3 或 4,您的函数也会“中断”。
  • @zmo 这根本不是真的。即使这是真的,编辑也不应该改变代码的基本部分,从而改变语义。
  • @zmo 包含False 的元组将是(False,)
  • @Maroon 也许知道一旦你return 某事,你的函数就完成了执行。你的for 循环从不检查除数字是否可被 2 整除之外的任何内容。

标签: python primes modulus


【解决方案1】:

我相信你的问题是退货放错了地方。您的代码当前仅循环通过 2,并且任何奇数显然不能被 2 整除。因此,它进入 if n%j==0,返回 True,并且由于 return 超出循环,停止运行。因此,任何奇数都将返回 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

【讨论】:

  • 这根本不起作用。 n % 1 什么都不做,因为每个整数都可以被 1 整除。 else 也没有意义,它只会返回完全错误的结果
  • Sorree... 但我只是复制了他的代码并稍作调整。如果你真的想要一个不同的素数检查器,我会发布一个。
  • 使用 abs() 不好。根据定义,负整数不是素数,因此它应该为那些返回 False。
【解决方案2】:

首先,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

【讨论】:

  • 哦,我想检查小数点,但回想起来有点没有意义,因为我自己输入值,这不应该发生。
  • 不确定您为什么接受其他答案。我不确定它的作用,但它不检查素数。编辑了一些关于检查小数的内容。
  • @popvitsj:我在接受答案时可能比平时更匆忙,最初的代码似乎对我有用/以某种方式解释了为什么会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多