簡體   English   中英

驗證輸入數字是否為素數

[英]Validate if input number is prime

試圖編寫一個程序來檢查一個數字是否是素數。 寫了下面的代碼,但不明白為什么我有2行的output:

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

我的 output 是:

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

sympy.isprime () 是SymPy模塊下的內置 function,可用於檢查可能的素數。 它是一個直接的 function,如果要檢查的數字是素數,則返回 True,如果數字不是素數,則返回 False。

>>> import simpy
  
>>> sympy.isprime(8)

False

>>> sympy.isprime(11)

True

或者像這樣定義一個 function

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

首先,你應該記住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分支。

為了更好地理解我的答案,我建議閱讀內容。


您的解決方案的錯誤是由於循環打印每次num%i == 0時數字都是素數,因此采用num = 6

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

正如Rajarshi Ghosh建議的那樣,您應該知道,在編程時,使用import ed 函數來執行這個簡單的操作是一個好主意,以避免對這樣一個簡單的工作進行長時間的操作。

如果您不想使用導入的 function,我建議您閱讀 這篇文章,他們解釋了 6 種方法來查找數字是否為素數,而無需使用其他人制作的函數。

您在 output 中遇到問題,不僅針對15的情況,還針對小於1的情況。 以下代碼應該可以工作。 它有兩個改進。

  1. 它為 15 打印正確的 output。關鍵是移動else塊以與for循環對齊。
  2. 它為小於 1 的任何數字(不是素數)打印正確的 output。 關鍵是使用while-break方法讓用戶輸入正確的數字,直到它大於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

Output:

在此處輸入圖像描述

什么是while循環? while 循環測試輸入條件。 每次循環完成時,都會重新評估條件(僅評估數字是否為素數,如果它大於 1)。 只要輸入的數字<=1 ,循環就會繼續執行(不斷詢問用戶輸入)。

如果您只想檢查一個數字是否為素數,只需執行以下操作:

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

首先, <= 1的數字不是素數。 因此,上面的代碼只有在num大於 1 時才會繼續。

其次,代碼檢查num是否可以被從 2 到num - 1的任何數字整除。 如果該范圍內有一個因子,則該數字不是素數,因此該標志設置為True並使用break循環。

最后,在循環之外,如果標志為True ,則num不是素數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM