检查数字是否为Python的素数

时间:2018-10-14 15:29:37

标签: python

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

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

  

is_prime(29)

,您应该获得如下输出:

  

数字29是质数。

  

数字29不是素数。

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

  1. 在学校,我记得素数仅被1除以其本身
  2. “ 0”和“ 1”不是素数

因此,我编写了代码,检查给定数字是否被2到(number-1)的所有数字相除。例如,如果给定值为“ 6”,则脚本首先检查6是否除以2。如果为true,则表示该数字不是质数。如果将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. ")

我认为两种解决方案都可以。 如果我错了,请纠正我 但是我想问你从编程的角度来看哪个解决方案更好?

4 个答案:

答案 0 :(得分:2)

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

  1. 如果您尝试的是数字,请勿尝试测试可除性 除以已经是先前数字的一个因素,例如 当您尝试除以2时,您只需要尝试奇数 数字。如果一个数字不能被2整除,则显然不是 可被4整除。
  2. 您只需要测试的平方根 号码。至少其中一个因素必须小于或等于 等于平方根。

答案 1 :(得分:0)

您的原始代码看起来正确。第二个不排除像run_expect_scripts() { expect expect_script1 exit_value="$?" output=$(expect expect_script2) echo "$output" return "$exit_value" } until [ run_expect_scripts -eq 0 -o a_counter -eq 5 ]; do a_counter=$(expr a_counter + 1) sleep 2s done use output of run_expect_scripts 这样的数字。

答案 2 :(得分:0)

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

for i in range(2, number)

但是如果我错了,请纠正我,我认为范围=(2,数字/ 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)就足够了吗?

答案 3 :(得分:-1)

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))