【Python實作】判斷使用者輸入的數字是否為質數?
📘 Python 自學|判斷是否是質數
練習目的
這次的練習目標是熟悉 Python 的流程控制與迴圈判斷。
- 練習 for 迴圈。
- 練習 if/else 判斷。
- 練習 try/except 處理輸入錯誤。
- 練習用 % 判斷是否能整除。
題目
讓使用者輸入一個正整數,並判斷這個數字是否為質數。
大於 1,且只能被 1 和自己整除的正整數。
🧪 完整程式碼
下面是完整的 Python 程式碼。
🔎 程式說明
接著把程式拆成幾段來看,會比較容易理解整個判斷流程。
1. 使用 try/except 確認輸入是否正確
這一段的目的是確認使用者輸入的是可以轉成整數的內容。
- input() 會取得使用者輸入的文字。
- int() 會嘗試把輸入內容轉成整數。
- 如果使用者輸入的是文字,例如 abc,就會發生 ValueError。
- 發生錯誤時,程式會印出 請輸入正確的數字,然後用 exit() 結束程式。
2. 先排除小於等於 1 的數字
質數必須是大於 1 的正整數,所以:
- 1 不是質數。
- 0 不是質數。
- 負數也不是質數。
因此,如果 n <= 1,就可以直接印出 不是質數。
如果數字大於 1,就先假設它是質數,設定:
一開始先假設它是 True,如果之後找到可以整除的數,再把它改成 False。
3. 用 for 迴圈檢查是否能被整除
這一段是整個程式的核心。
它會從 2 開始檢查,一路檢查到 根號 n 左右。
為什麼只檢查到根號 n?
如果一個數字 n 可以被分解成兩個因數:
那麼 a 和 b 不可能都大於根號 n。
換句話說,如果在 2 到 根號 n 之間都找不到可以整除的數,那後面也不需要再檢查了。
不需要從 2 一路檢查到 n - 1,只要檢查到 根號 n 就可以省下很多時間。
range(2, int(n**0.5) + 1) 是什麼意思?
- 2:從 2 開始檢查,因為 2 是最小的質數。
- n**0.5:計算 n 的平方根。
- int(n**0.5):把平方根轉成整數。
- + 1:因為 Python 的 range() 不包含結束值,所以要加 1。
例如 n = 9,根號 9 是 3。 如果沒有加 1,range(2, 3) 只會檢查 2,不會檢查 3。
但 9 可以被 3 整除,所以要寫成:
4. 如果找到可以整除的數,就不是質數
n % x 是取餘數。
如果 n % x == 0,代表 n 可以被 x 整除。
只要找到一個除了 1 和自己以外還能整除的數,就表示這個數字不是質數。
- 找到可整除的數:把 is_prime 改成 False。
- 使用 break 離開迴圈,因為已經確定不是質數了。
寫成 true 或 false 會出錯。
5. 最後輸出結果
這一行使用了 Python 的一行 if/else 寫法。
意思是:
- 如果 is_prime 是 True,就印出 是質數。
- 否則就印出 不是質數。
🧭 執行流程整理
用一張表整理整個判斷流程,會更清楚。
| 步驟 | 程式做什麼 | 目的 |
|---|---|---|
| 1 | 讀取使用者輸入 | 取得要判斷的數字。 |
| 2 | 用 try/except 檢查輸入 | 避免輸入文字造成程式錯誤。 |
| 3 | 判斷 n 是否小於等於 1 | 先排除一定不是質數的情況。 |
| 4 | 從 2 檢查到根號 n | 確認是否有其他因數。 |
| 5 | 找到因數就 break | 已確定不是質數,提早結束迴圈。 |
| 6 | 輸出判斷結果 | 顯示「是質數」或「不是質數」。 |
🔢 測試範例
可以用幾個數字測試看看結果是否正確。
| 輸入 | 判斷 | 原因 |
|---|---|---|
| 1 | 不是質數 | 質數必須大於 1。 |
| 2 | 是質數 | 2 是最小的質數。 |
| 3 | 是質數 | 只能被 1 和 3 整除。 |
| 4 | 不是質數 | 可以被 2 整除。 |
| 9 | 不是質數 | 可以被 3 整除。 |
| 17 | 是質數 | 沒有其他整數可以整除。 |
✅ 小結
這個質數判斷範例雖然不長,但一次練到了很多 Python 基礎觀念。
- try/except:處理使用者輸入錯誤。
- if/else:判斷不同情況。
- for 迴圈:依序檢查可能的因數。
- % 取餘數:判斷是否能整除。
- break:找到答案後提早離開迴圈。
- n**0.5:用平方根減少不必要的檢查次數。
判斷質數時,不需要一路檢查到 n - 1。
只要從 2 檢查到 根號 n,如果都不能整除,就可以判斷它是質數。
留言
張貼留言