1. 程式人生 > 其它 >第18期-判斷素數

第18期-判斷素數

1 問題描述

素數又稱質數(Prime number),是指只有1和它本身兩個因數的自然數,如2、3、5、7、11、13等只能被 1 和該整數整除。
質數是與合數相對立的兩個概念,比1大但不是素數的數稱為合數,二者構成了數論當中最基礎的定義之一。
1 和 0 既非素數也非合數。
使用者輸入一個大於1的正整數,判斷它是否為素數~

2 解題思路

  • 首先用input函式獲取使用者輸入的數字
  • 然後根據素數的定義和特點,判斷該數值是否為素數
  • 最後輸出判斷結果

3 解題方法

方法一

num = int(input("請輸入一個大於1的整數:"))
if num > 1:
    for i in range(2, num):
        
if num % i == 0: print(f"{num}不是素數") break else: print(f"{num}是素數") else: print("輸入錯誤,輸入大於1的整數")
View Code

第1行:用input函式獲取使用者輸入的數值,int函式將其轉化為整型,賦值給變數num
第2行:由於素數是大於 1 的整數,用if...else語句對使用者輸入的數值進行判斷,當該數值大於 1 時,繼續判斷是否為素數,否則轉到第 9 行,用print函式列印 "輸入錯誤,輸入大於1的整數"
第3-6行:用for迴圈遍歷 2 至(num - 1)之間所有的數,由於素數只能被 1 和該整數整除,如果使用者輸入的數值能被 2 至(num - 1)之間的任意一個數整除,則不是素數,用break退出整個迴圈
第7-8行:否則用print函式列印該數值是素數

方法二

num = int(input("請輸入一個大於1的整數:"))
if num > 1:
    for i in range(2, int(num ** 0.5 + 1)):
        if num % i == 0:
            print(f"{num}不是素數")
            break
    else:
        print(f"{num}是素數")
else:
    print("輸入錯誤,輸入大於1的整數")
View Code

第1行:用input函式獲取使用者輸入的數值,int函式將其轉化為整型,賦值給變數num
第2行:由於素數是大於 1 的整數,用if...else語句對使用者輸入的數值進行判斷,當該數值大於 1 時,繼續判斷是否為素數,否則轉到第 9 行,用print函式列印 "輸入錯誤,輸入大於1的整數"
第3-6行:用for迴圈遍歷 2 至根號n 之間所有的數,如果使用者輸入的數值能被 2 至根號n 之間的任意一個數整除,則不是素數,用break退出整個迴圈
第7-8行:否則用print函式列印該數值是素數

為什麼判定一個素數只要將此數被2 至根號n 整除即可???
設n為合數,n=ab
若a = b, 則a 和 b 都等於根號n
若a ≠ b,則 a, b 之中總有一個小於根號n ,另一個大於根號n


也就是說合數有大於根號n的因數存在,則必有一個小於根號n 的因數與之對應。
再換個說法,如果一個數沒有小於根號n 的因數,則不能有大於根號n 的因數。
所以只檢查是否有小於或等於根號n 的因數即可

方法三

num = int(input("請輸入一個大於1的整數:"))
if num > 1:
    if num == 2:
        print(f"{num}是素數")
    elif num % 2 == 0:
        print(f"{num}不是素數")
    else:
        for i in range(3, int(num ** 0.5) + 1, 2):
            if num % i == 0:
                print(f"{num}不是素數")
                break
        else:
            print(f"{num}是素數")
else:
    print("輸入錯誤,輸入大於1的整數")
View Code

第1行:用input函式獲取使用者輸入的數值,int函式將其轉化為整型,賦值給變數num
第2行:由於素數是大於 1 的整數,用if...else語句對使用者輸入的數值進行判斷,當該數值大於 1 時,繼續判斷是否為素數,否則轉到第 14 行,用print函式列印 "輸入錯誤,輸入大於1的整數"
第3-4行:若該數值等於2,則列印該數是素數
第5-6行:偶數中除了2都不是質數,且奇數的因數也沒有偶數,所以若該數值能被2整除,則列印該數不是素數
第7-13行:用for迴圈遍歷 3 至根號n 之間所有的數,如果使用者輸入的數值能被3 至根號n 之間的任意奇數整除,則不是素數,用break退出整個迴圈;否則用print函式列印該數值是素數