【问题标题】:Validate if input number is prime验证输入数字是否为素数
【发布时间】:2022-02-02 13:46:49
【问题描述】:

试图编写一个程序来检查一个数字是否是素数。 写了下面的代码,但不明白为什么我有2行的输出:

num = int(input("Provide number to check if prime: "))
if num <=1:
    print("Invalid choice, try again")
    num = int(input("Provide number to check if prime: "))

for i in range(2,num):
    if num% i ==0:
        print("Number is not prime")
        break
    if num %i !=0:
        print("Number is prime")

我的输出是:

Provide number to check if prime: 15
Number is prime
Number is not prime

【问题讨论】:

    标签: python python-3.x numbers primes


    【解决方案1】:

    sympy.isprime() 是 SymPy 模块下的内置函数,可用于检查可能的素数。它是一个直接函数,如果要检查的数字是素数,则返回 True,如果要检查的数字不是素数,则返回 False。

    >>> import simpy
      
    >>> sympy.isprime(8)
    
    False
    
    >>> sympy.isprime(11)
    
    True
    
    

    或者定义一个这样的函数

    >>> def isPrime(k):
        
        # 1 is not prime number
        if k==1:
            return False
    
        # 2, 3 are prime
        if k==2 or k==3: 
            return True
    
        # even numbers are not prime
        if k%2==0: 
            return False
    
        # check all numbers till square root of the number , 
        # if the division results in remainder 0
        # (skip 2 since we dont want to divide by even numbers)
    
        for i in range(3, int(k**0.5)+1, 2):
            if k%i==0:
                return False
    
        return True
    
    >>> print(isPrime(13))
    
    True
    
    >>> print(isPrime(18))
    
    False
    
    

    【讨论】:

    【解决方案2】:

    首先,您应该记住1 根据定义不是质数,即使它不能被任何其他数字整除:

    if (num == 1):
        print("The number is NOT prime")
    else:
        for i in range(2, num):
            if (num%i == 0): # If the number has a divisor
                print("The number is NOT prime")
                break
        else: # If the for loop ends without reaching any break
            print("The number IS prime")
    

    当循环结束而没有到达任何break 并且循环至少执行一次时,到达for 循环的else 分支。

    为了更好地理解我的回答,我建议阅读this


    你的解决方案的错误是由于循环打印每次num%i == 0的数字都是素数,所以取num = 6

    6%4 != 0 # The number is prime
    6%5 != 0 # The number is prime             
    

    正如Rajarshi Ghosh 所建议的那样,您应该知道,在编程时最好使用imported 函数来执行这种简单的操作,以避免对这种简单的工作进行长时间的操作。

    如果您不想使用导入的函数,我建议您阅读this article,他们解释了 6 种方法来查找数字是否为素数,而无需使用其他人制作的函数。

    【讨论】:

    • 虽然链接没问题,但最好在答案中包含链接中的一些文本或信息。
    • 好的,我正在编辑答案,以便在代码的 cmets 中提供解释。
    • @FLAK-ZOSO - 感谢您的指出 - 一直认为 1 是素数,我错了!!! :-) ...其他人立即投票反对
    • 关键要点——“现代数学家将一个数字定义为素数,如果它被两个数字整除”——酷!
    【解决方案3】:

    您的输出有问题,不仅是15 的情况,还有小于1 的情况。以下代码应该可以工作。它有两个改进。

    1. 它打印 15 的正确输出。关键是移动 else 块以与 for 循环对齐。
    2. 它为小于 1 的任何非素数的数字打印正确的输出。关键是使用while-break method 让用户输入正确的数字,直到它大于1。
    num = int(input("Provide number to check if prime: "))
    while num <=1: #you need to use while loop
        print("Invalid choice, try again")
        num = int(input("Provide number to check if prime: "))
        if num > 1: #only evaluate number is prime or not if it is greater than 1
            for i in range(2,num):
                if num% i ==0:
                    print("Number is not prime")
                    break
            else: #to move the `else` block to align with the `for` loop.
                print("Number is prime")
            break #add a break here
    

    输出:

    什么是while循环? while 循环测试输入条件。每次循环完成时,都会重新评估条件(仅评估数字是否为素数,如果它大于 1)。只要输入的数字是&lt;=1,循环就会继续执行(不断询问用户输入)。

    【讨论】:

      【解决方案4】:

      如果您只想检查一个数字是否为素数,只需执行以下操作:

      num = int(input("Provide number to check if prime: "))
      
      flagNotPrime = False
      
      if num > 1:
          for i in range(2, num):
              if (num % i) == 0:
                  flagNotPrime = True
                  break
      
      if flagNotPrime:
          print("Number is not prime")
      
      else:
          print("Number is prime")
      

      首先,&lt;= 1 不是素数。因此,上面的代码只有在num大于1时才会继续。

      其次,代码检查num 是否可以被2 到num - 1 之间的任何数字整除。如果该范围内有一个因子,则该数字不是素数,因此将标志设置为 True 并使用 break 中断循环。

      最后,在循环之外,如果标志是True,那么num 不是素数。

      【讨论】:

      • 这只会检查数字是偶数还是奇数...
      • 根据这个程序,10 是素数。
      • 你的逻辑是错误的。 “当一个数字除以 2 后的余数为零时,它是素数” - 什么?!偶数是从什么时候开始素数的?
      • 对不起,我只是在想别的东西,写的非常错误。我已经编辑了我的代码。
      猜你喜欢
      • 1970-01-01
      • 2017-11-25
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多