【问题标题】:Check if the number is the prime in Python检查数字是否是Python中的素数
【发布时间】:2018-10-14 15:29:37
【问题描述】:

我人生中第一次从零开始学习编程。我正在学习 Python 语言。我的第一个困难任务是编写检查数字是否为质数的算法。

脚本应该以非常简单的方式工作。你输入:

is_prime(29)

你应该得到这样的输出:

数字 29 是质数。

数字 29 不是质数。

我没有在互联网上查看任何解决方案。我自己做的。我的假设如下:

  1. 从学校我记得素数只能被 1 和自身整除
  2. '0' 和 '1' 不是质数

所以我编写了检查给定数字是否除以从 2 到 (number-1) 的所有数字的代码。例如,如果给定值为“6”,则脚本首先检查 6 是否除以 2。如果为真,则表示该数字不是质数。如果 6 不会除以 2,则脚本会检查 6 是否除以 3。如果是,则意味着该数字不是质数。如果是“7”号,脚本会检查 7/2,然后是 7/3,然后是 7/4,然后是 7/5,然后是 7/6。

代码是这样的:

def is_prime(number):
    if number == 0 or number == 1:
        print(f"The number {number} is NOT the prime number.")
    elif number == 2:
        print(f"The number {number} is the prime number.")
    else:
        for i in range(2, number):
            if number % i == 0:
                check = "is NOT"
                break
            else:
                check = "is"
        print(f"The number {number} {check} the prime number.")

但后来,我实际上意识到了三件事:

  1. 如果这个数除以2,肯定不是素数
  2. 如果数字不被2整除,则可以被3或5整除。
  3. 如果这个数不被2整除,不被3整除,也不被5整除,这意味着这个数是质数。此规则的唯一例外是这三个数字 2,3 和 5。

就是这样。于是我写了如下代码

def is_prime(number):
    if number > 1:
        if (number %2 == 0 and number != 2) or (number %3 == 0 and number != 3 ) or(number %5 == 0 and number != 5):
            print(f"The number {number} is NOT the prime number. ")
        else:
            print(f"The number {number} is the prime number. ")

    else:
        print(f"The number {number} is NOT the prime number. ")

我认为这两种解决方案都可以。 如有错误请指正 但是我想问一下,从编程的角度来看,哪种方案更好?

【问题讨论】:

  • 如果number % 7 == 0 怎么办?另外,根据你的第二个函数,179_426_549 是素数吗?
  • @ForceBru 是对的!您的代码会将 49 视为素数,而实际上并非如此。
  • 另外,请查看this。在现代 GPU 上,最大的已知素数可以在 34 小时验证为素数。相反,您的代码将闪电般快速,但给出的结果同样不正确。如果您为素数检查创建了如此快速的算法,那么您肯定会获得某种奖励。
  • 根据第二个代码,179 是素数,426 不是素数,549 不是素数。我现在已经检查过了。我认为这是正确的。它不是?但是你说 49 是素数是对的,这当然是错误的。

标签: python


【解决方案1】:

即使你的第一个是正确的,而第二个不是,你可以通过以下方式提高算法速度:

  1. 如果您正在尝试的数字,请不要尝试测试可除性 除以已经是先前数字的一个因素,例如 当您尝试除以 2 时,您只需要尝试奇数 数字。如果一个数不能被 2 整除,那么它显然不是 能被 4 整除。
  2. 你只需要测试到平方根 数字。至少一个因素需要小于或 等于平方根。

【讨论】:

  • 你是绝对正确的。例如,当数字是 79 并且第一次检查说它不被 2 整除时,完全没有必要检查该数字是否被 4、8、16、32 整除。你是绝对正确的。但是我怎样才能在代码中实现这样的东西呢?如果该值不被 2 整除,我如何绕过检查 2^n 的整除性。有可能吗?
  • 有一些算法可以检查一个数字“可能”是一个素数。据我所知,实际检查数字是否为素数的最佳方法是建立一个素数表并检查素数的可分性,直到数字的平方根。该表最容易从第一个素数开始递归构建,即 2。
【解决方案2】:

您的原始代码看起来是正确的。第二个不排除像49这样的数字。

【讨论】:

  • 这不是真的。第二个代码正确地表明 7、11、13 是质数。我已经检查过了。
  • 我猜马特的意思是它会说具有这些因素的数字是素数。例如 7*7 = 49
【解决方案3】:

您确认我的第一个解决方案是正确的。 在“for”循环中检查的范围是:

for i in range(2, number)

但如果我错了请纠正我,我认为有 range = (2, number/2) 就足够了

例如,让我们考虑数字 541,它是质数。我的代码将检查模数如下:

541/2 541/3 541/4 . . . 541/538 541/539 541/540

但是检查大于 270 的除数(几乎是 541 的一半)是完全没用的。如果 541 不被 270 整除,那么显然不能被 271、272、273、274、275 整除。

所以我认为拥有就足够了:

for i in range(2, round(number/2)+1)

我必须添加 + 1,否则我在运行数字 3 的函数时会出错。

你怎么看? 有检查范围 (2, number/2) 而不是 (2, number) 就足够了?

【讨论】:

    【解决方案4】:
    def is_prime(number):
    
        count = 0
    
        for i in range(1,number+1):
    
            if number%i == 0:
                count +=1
    
        if count == 2:
    
            print('The number {0} is the prime number.'.format(number))
    
        else:
    
            print('The number {0} is NOT the prime number.'.format(number))
    

    【讨论】:

    • 这是正确答案。素数是只能被自身和 1 整除的数。在这种情况下,count == 2
    • 如果你使用(2,number)然后count is 0 for a prime number. If you use (2,math.sqrt(number)), it's even faster. And you should stop as soon as you find a 0`模。无需走到最后。
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 2015-03-17
    • 2015-09-15
    • 1970-01-01
    • 2013-03-22
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多