迴圈控制:break 與 continue
上一節你學了 while 迴圈:跑到條件不成立為止。加上更早學的 for 迴圈,你現在有兩種讓電腦重複做事的工具了。
但你有沒有覺得,目前的迴圈有點「死板」?你只能等條件自然變成 False 才能離開,或是等 range() 跑完才停。如果你在迴圈跑到一半的時候,已經找到你要的東西了呢?或者某一輪遇到了不想處理的情況,想直接跳到下一輪呢?
今天要教的兩個指令,就是讓你對迴圈有「精細控制」的武器。

📷 圖 6:break 像煞車、continue 像快轉的四格漫畫(AI 製圖)
💡 📋 學習目標
看完這一節,希望你將能夠:
- 用
break在迴圈中途強制離開 - 用
continue跳過當前這一輪,直接進入下一輪 - 在
for和while兩種迴圈中都能使用 break 和 continue - 用 Trace Table 追蹤 break/continue 觸發時的迴圈狀態
- 解兩道 Judge 題 (ノ◕ヮ◕)ノ*:・゚✧
先從比較直覺的那個開始:break。你可以把它想成迴圈的「緊急煞車」。
break:迴圈的緊急煞車
為什麼需要 break?
為什麼用「煞車」來比喻?因為 break 跟開車煞車的邏輯一模一樣:你本來在跑,突然碰到了某個狀況,決定「不跑了」,直接停車下來。
想像你在教室裡點名,從 1 號點到 40 號。但你其實只是要找「小明」,找到他就不用繼續點了。沒有 break 的話,你得把 40 個人全點完才能停。有了 break,點到小明那一瞬間就可以喊「找到了,停!」
在 for 迴圈中使用 break
來看實際的程式碼。假設我們想找出 1 到 10 之中,第一個能被 3 整除的數字:
for i in range(1, 11):
if i % 3 == 0:
print("找到了:", i)
break輸出:
找到了: 3Trace Table:
| 第幾次 | i | i % 3 == 0? | 動作 |
|---|---|---|---|
| 1 | 1 | ❌ | 繼續 |
| 2 | 2 | ❌ | 繼續 |
| 3 | 3 | ✅ | 印出 3,break 🛑 |
迴圈原本要跑 10 次,但第 3 次就觸發 break,直接跳出迴圈。第 4 到第 10 次完全不執行。
在 while 迴圈中使用 break
break 在 while 裡也一樣好用。一個經典的用法是搭配 while True(永遠為真的條件),再用 break 手動控制何時離開:
total = 0
while True:
n = int(input())
if n == 0:
break
total = total + n
print("總和:", total)這段程式會不斷讀取數字、累加,直到使用者輸入 0 才停。
`while True` + `break` 是常見模式
當你不容易在 while 條件裡寫出完整的終止條件時,while True 搭配 break 是一種乾淨的寫法。先讓迴圈「無限跑」,然後在裡面用 if 判斷什麼時候該離開。
⚠️ break 只跳出「最近的一層」迴圈
如果你有迴圈裡面套迴圈(巢狀迴圈,後面的章節會教),break 只會跳出它所在的那一層,不會連外層一起跳。現在先記住就好。

📷 圖 7:教室點名找小明用 break 停止的概念圖(AI 製圖)
Judge 解題實戰:第一個因數
學完 break,來用它解一道 Judge 題:
題目說明
- Input:一行輸入,一個正整數 N(N ≥ 4)
- Output:N 的最小因數(不含 1 和 N 本身)
範例
| Input | Output |
|---|---|
12 | 2 |
15 | 3 |
老師的建議
先試試看!提示:從 2 開始往上找,找到第一個能整除 N 的就是答案。
卡關了再看解答!
Step 1:分析 IPO
- I(Input):讀取正整數 N
- P(Process):從 2 開始依序檢查每個數字,找到第一個
N % i == 0的 i - O(Output):印出那個 i
找到第一個就停,不用再繼續找。完美的 break 場景。
Step 2:寫出程式碼
從 2 開始找,找到就停。翻譯成 Python:
n = int(input())
for i in range(2, n):
if n % i == 0:
print(i)
break逐行解讀:
n = int(input())— 讀取正整數 Nfor i in range(2, n):— 從 2 到 N-1 逐一檢查if n % i == 0:— 如果 i 能整除 Nprint(i)— 印出這個因數break— 立刻離開迴圈,不再繼續找
以 N = 12 為例的 Trace Table:
| 第幾次 | i | 12 % i == 0? | 動作 |
|---|---|---|---|
| 1 | 2 | ✅ (12÷2=6) | 印 2,break 🛑 |
第一個就中了。如果沒有 break,程式還會繼續找到 3、4、6,但我們只需要最小的那個。
常見錯誤排查
❌ 忘記
break沒有
break的話,會印出所有因數(2、3、4、6),而不是只印最小的。
自己動手試試!
兩題練練手 ╮(╯∀╰)╭
密碼驗證器
問題情境:小柔加入了學校的程式設計社,社團最近要上線一個社員專屬網站,需要設計登入系統。小柔負責撰寫密碼驗證的程式邏輯:系統會先讀入正確密碼,然後讓使用者最多嘗試 K 次輸入。如果某次猜對了,立刻顯示 OK 並結束驗證;如果 K 次機會全部用完卻還沒猜對,就顯示 LOCKED,帳號鎖定。為了避免有人用程式暴力破解,社團特別要求嘗試次數用完後就必須鎖住。小柔知道每次猜測後都要立刻判斷,不能繼續猜,所以她想到可以用 break 在猜對的瞬間跳出迴圈。
🔍 思考引導:
🔀 試著補完這張流程圖...
下面的流程圖有些步驟被
???遮住了,試著想想看遮住的地方應該填什麼:
輸入格式:
- 第一行:正確密碼 secret(字串)
- 第二行:正整數 K(1 ≤ K ≤ 10),最大嘗試次數
- 接下來最多 K 行:每行一個猜測(字串)
輸出格式: 若在 K 次內猜對,輸出 OK;若 K 次全部猜錯,輸出 LOCKED。
範例一:
| 輸入 | 輸出 |
|---|---|
abc3xyzabc | OK |
範例二:
| 輸入 | 輸出 |
|---|---|
abc2xy | LOCKED |
範例說明:
- 第一步:讀入正確密碼
abc,最大嘗試次數 K = 3 - 第二步:第 1 次猜測讀入
xyz,與abc不同,繼續 - 第三步:第 2 次猜測讀入
abc,與abc相同——猜對了! - 第四步:印出
OK,並break離開迴圈,結束程式
老師的提示
用 for 迴圈跑 K 次,每次讀一個猜測並比較。猜對立刻 break;迴圈自然結束(沒有 break)就代表全部猜錯,在迴圈外印 LOCKED。
累加到目標
問題情境:阿杰最近迷上了便利商店的集點活動,消費滿額就能集到點數換好禮。他發現每次購物的金額是 1 元、2 元、3 元⋯⋯依序遞增(第 1 次花 1 元、第 2 次花 2 元),而且每次購物只能買一樣東西,金額剛好就是購物的次序數。他想知道:至少要買幾次,累計花費才能達到集點門檻 T 元?換句話說,他要找出最小的 n,使得 1+2+3+...+n ≥ T。阿杰想用 while True 搭配 break 來寫這個程式:每加一個數就檢查有沒有達標,一達標就立刻停下來,印出那個最小的購買次數。
🔍 思考引導:
🔀 試著補完這張流程圖...
下面的流程圖有些步驟被
???遮住了,試著想想看遮住的地方應該填什麼:
輸入格式:
- 第一行:正整數 T(1 ≤ T ≤ 10000),集點門檻金額
輸出格式: 一行,印出最小的 n,使得 1+2+...+n ≥ T。
範例一:
| 輸入 | 輸出 |
|---|---|
10 | 4 |
範例二:
| 輸入 | 輸出 |
|---|---|
1 | 1 |
範例說明:
- 第一步:T = 10,設 total = 0、n = 0
- 第二步:n = 1,total = 0 + 1 = 1,尚未 ≥ 10,繼續
- 第三步:n = 2,total = 1 + 2 = 3,尚未 ≥ 10,繼續
- 第四步:n = 3,total = 3 + 3 = 6,尚未 ≥ 10,繼續
- 第五步:n = 4,total = 6 + 4 = 10,10 ≥ 10,達標!
break並印出 4
老師的提示
用 while True 搭配兩個變數:n(目前加到哪個數)和 total(累計總和)。每輪先讓 n 加 1、再把 n 加進 total,然後判斷 total 是否 ≥ T——是的話就 break 並輸出 n。
break 是「整個不跑了」。但有時候你不想完全停下來,只是「這一輪不想處理,跳到下一輪」。這就是 continue 的用途。
continue:跳過這一輪
為什麼需要 continue?
為什麼用「快轉」來比喻?因為 continue 就像看影片時按快轉:你不是要停止看影片(那是 break),只是「這一段不想看,快轉到下一段」。
想像你在批改全班的考卷,但有些人缺考(交白卷)。你不需要幫白卷打分數,直接跳過,繼續改下一張。這就是 continue 的邏輯:遇到不需要處理的情況,跳過這一次迭代,直接進入下一次。
在 for 迴圈中使用 continue
印出 1 到 10 之中,跳過所有 3 的倍數:
for i in range(1, 11):
if i % 3 == 0:
continue
print(i)輸出:
1
2
4
5
7
8
10Trace Table:
| 第幾次 | i | i % 3 == 0? | 動作 | 輸出 |
|---|---|---|---|---|
| 1 | 1 | ❌ | 正常執行 | 1 |
| 2 | 2 | ❌ | 正常執行 | 2 |
| 3 | 3 | ✅ | continue ⏭ | (跳過) |
| 4 | 4 | ❌ | 正常執行 | 4 |
| 5 | 5 | ❌ | 正常執行 | 5 |
| 6 | 6 | ✅ | continue ⏭ | (跳過) |
| ... | ... | ... | ... | ... |
| 10 | 10 | ❌ | 正常執行 | 10 |
注意:continue 不會結束迴圈,只是跳過 continue 後面的程式碼,直接進入下一次迭代。
在 while 迴圈中使用 continue
continue 在 while 裡也能用,但要特別小心:
i = 0
while i < 5:
i = i + 1
if i == 3:
continue
print(i)輸出:
1
2
4
5⚠️ while + continue 的陷阱
在 while 迴圈裡用 continue 時,一定要確保更新條件的程式碼在 continue 之前。否則 continue 會跳過更新步驟,造成無窮迴圈。
i = 0
while i < 5:
if i == 3:
continue # ❌ 跳過了 i = i + 1,i 永遠是 3!
print(i)
i = i + 1上面的程式碼會卡在 i = 3 無限循環。修正方法:把 i = i + 1 移到 continue 之前。

📷 圖 8:continue 像批改跳過白卷的概念圖(AI 製圖)
Judge 解題實戰:跳過倍數
來用 continue 解一題:
題目說明
- Input:兩行輸入,第一行正整數 N,第二行正整數 K
- Output:印出 1 到 N 之間所有「不是 K 的倍數」的數字
範例
| Input | Output |
|---|---|
103 | 12457810 |
老師的建議
先自己挑戰看看!提示:遇到 K 的倍數就 continue。
Step 1:分析 IPO
- I(Input):讀取 N 和 K
- P(Process):從 1 到 N 逐一檢查,遇到 K 的倍數就跳過
- O(Output):印出不是 K 倍數的數字
Step 2:寫出程式碼
遇到倍數就跳過,其餘照印。程式碼:
n = int(input())
k = int(input())
for i in range(1, n + 1):
if i % k == 0:
continue
print(i)逐行解讀:
n = int(input())— 讀取 Nk = int(input())— 讀取 Kfor i in range(1, n + 1):— 從 1 到 Nif i % k == 0:— 如果 i 是 K 的倍數continue— 跳過這一輪,不印出print(i)— 不是 K 倍數的才會走到這裡
「老師,那不用 continue 也可以吧?直接寫 if i % k != 0: print(i) Σ(゚Д゚)」
沒錯!很多時候用 if 就能達到跟 continue 一樣的效果。但當迴圈裡有很多行程式碼時,continue 可以讓你在最前面就「過濾掉」不需要處理的情況,避免後面一大堆程式碼被包在 if 裡面,程式碼會更乾淨。
常見錯誤排查
❌
i % k == 0寫成i % k != 0邏輯反了。
continue的意思是「跳過」,所以條件是「遇到倍數就跳過」,用==。
自己動手試試!
最後兩題收尾 ୧(๑•̀ɜ•́๑)૭✧
跳五累加器
問題情境:小萱的數學老師在課堂上出了一道特別的加總練習:把 1 到 N 之間的所有整數加起來,但凡是 5 的倍數(5、10、15⋯⋯)一律不計入。老師說這是為了讓同學熟悉「有條件的累加」,也順便複習倍數判斷的觀念。小萱覺得這道題很適合拿來練習迴圈控制,她想用 for 迴圈逐一掃過每個數字,遇到 5 的倍數就用 continue 跳過不加,其他數字才累計到總和裡。她想先在紙上畫流程圖,確認邏輯之後再動手寫程式,確保每一步都清楚。
🔍 思考引導:
🔀 試著補完這張流程圖...
下面的流程圖有些步驟被
???遮住了,試著想想看遮住的地方應該填什麼:
輸入格式:
- 第一行:正整數 N(1 ≤ N ≤ 1000)
輸出格式: 一行,印出 1 到 N 所有非 5 倍數的整數之和。
範例一:
| 輸入 | 輸出 |
|---|---|
10 | 40 |
範例二:
| 輸入 | 輸出 |
|---|---|
5 | 10 |
範例說明:
- 第一步:N = 10,1 到 10 共有 5、10 要跳過
- 第二步:加總 1 + 2 + 3 + 4 = 10;遇到 5 →
continue跳過 - 第三步:加總 10 + 6 + 7 + 8 + 9 = 40;遇到 10 →
continue跳過 - 第四步:迴圈結束,印出 40
老師的提示
在 for 迴圈的最前面加一個判斷:若 i % 5 == 0 就 continue,這樣後面的累加那行就不會被執行到。其他邏輯和普通的累加器一模一樣。
跳零位數和
問題情境:阿磊對數字很著迷,他在研究一個規律:把一個整數的每一位數字加起來,但遇到 0 就跳過不加。例如 1034 的位數是 1、0、3、4,跳過 0 之後加起來是 1+3+4=8。阿磊覺得用手算太慢,尤其當數字位數很多的時候容易出錯,所以他想寫一支程式來驗證自己的手算結果。阿磊知道可以用 % 10 取出個位數、用 // 10 去掉個位數的技巧(在 2-2 學過的),然後用 while 迴圈不斷拆解數字,對每一個取出的位數判斷:如果是 0 就 continue 跳過,不是 0 才加進去。
🔍 思考引導:
🔀 試著補完這張流程圖...
下面的流程圖有些步驟被
???遮住了,試著想想看遮住的地方應該填什麼:
輸入格式:
- 第一行:正整數 N(1 ≤ N ≤ 10^9)
輸出格式: 一行,印出 N 的各位數中非零數字的總和。
範例一:
| 輸入 | 輸出 |
|---|---|
1034 | 8 |
範例二:
| 輸入 | 輸出 |
|---|---|
100 | 1 |
範例說明:
- 第一步:N = 1034,total = 0
- 第二步:digit = 1034 % 10 = 4,N 變為 103;4 不是 0,total = 0 + 4 = 4
- 第三步:digit = 103 % 10 = 3,N 變為 10;3 不是 0,total = 4 + 3 = 7
- 第四步:digit = 10 % 10 = 0,N 變為 1;0 要跳過,
continue,total 不變(仍為 7) - 第五步:digit = 1 % 10 = 1,N 變為 0;1 不是 0,total = 7 + 1 = 8
- 第六步:N = 0,迴圈結束,印出 8
老師的提示
用 while N > 0 的迴圈,每輪先用 % 10 取個位數、// 10 縮短 N。取出位數後,若為 0 就 continue 跳過累加那行,若不為 0 才加進 total。
質數判斷
問題情境:小韻在數學社的期末報告中,要說明「質數」這個概念:質數是只能被 1 和自身整除的正整數,例如 2、3、5、7、11 都是質數,而 6(可被 2 整除)、15(可被 3 和 5 整除)則不是。為了在報告中實際示範如何用程式判斷質數,小韻想寫一支程式:輸入一個整數 N,從 2 開始一個一個試除,一旦找到能整除 N 的數字,就代表 N 有因數,不是質數,用 break 立刻停下來;若從 2 試到 N-1 都沒有任何一個能整除 N,那麼 N 就是質數。她打算在社團發表時用這支程式現場測試給大家看。
🔍 思考引導:
💭 如果用數學來表達...
換句話說,只要在 2 到 N-1 之間找到任何一個 d,使得 N÷d 整除(餘數為 0),N 就不是質數。你只需要找到「第一個」這樣的 d,找到了就能立刻下結論——這正是
break的用武之地。
🔀 試著補完這張流程圖...
下面的流程圖有些步驟被
???遮住了,試著想想看遮住的地方應該填什麼:
輸入格式: 第一行:一個正整數 N(2 ≤ N ≤ 100000)
輸出格式: 如果 N 是質數,印出 Yes;否則印出 No
範例一:
| 輸入 | 輸出 |
|---|---|
17 | Yes |
範例二:
| 輸入 | 輸出 |
|---|---|
15 | No |
範例說明: 以 N = 15 為例(範例二):
- 第一步:d = 2,15 % 2 = 1 ≠ 0,繼續
- 第二步:d = 3,15 % 3 = 0,找到因數!
- 第三步:立刻
break,印出No,不再繼續試其他數字
老師的提示
從 2 到 N-1 嘗試整除,找到第一個因數就立刻印 No 並 break。如果迴圈自然跑完(沒有觸發 break),才代表是質數,印 Yes。可以用一個布林旗標 is_prime 來記錄是否找到因數。
完美數搜尋
問題情境:阿銘在數學課讀到了一個神奇的概念:「完美數」。完美數是指一個正整數,其所有真因數(即除了自身以外的因數)加起來剛好等於這個數本身。例如 6 的真因數是 1、2、3,而 1+2+3=6,正好等於 6,所以 6 是完美數;28 的真因數是 1、2、4、7、14,而 1+2+4+7+14=28,也是完美數。阿銘很好奇在更大的範圍內還有沒有其他完美數,於是想寫一支程式,輸入上限 N,找出 1 到 N 之間所有的完美數並印出。他計畫用雙層迴圈:外層遍歷每個候選數,內層計算真因數之和,最後比較判斷。
🔍 思考引導:
🧩 把大問題拆成小問題...
- 第一步 — 遍歷候選數:用外層迴圈從 1 到 N,逐一取出每個數字當作候選者
- 第二步 — 計算真因數之和:對每個候選數,用內層迴圈從 1 試到它自己 -1,把能整除它的數字加起來
- 第三步 — ???:你覺得算完真因數總和之後,下一步要做什麼判斷?
- 第四步 — ???:符合條件的數字要怎麼輸出?
🔀 試著補完這張流程圖...
下面的流程圖有些步驟被
???遮住了,試著想想看遮住的地方應該填什麼:
輸入格式: 第一行:一個正整數 N(6 ≤ N ≤ 500)
輸出格式: 每行一個完美數,從小到大排列。
範例一:
| 輸入 | 輸出 |
|---|---|
30 | 628 |
範例二:
| 輸入 | 輸出 |
|---|---|
500 | 628496 |
範例說明: 以 N = 30(範例一)為例,說明找到 6 和 28 的過程:
- 第一步:當外層迴圈 n = 6 時,開始計算真因數之和
- 第二步:d = 1,6 % 1 = 0,加入 → factor_sum = 1
- 第三步:d = 2,6 % 2 = 0,加入 → factor_sum = 3
- 第四步:d = 3,6 % 3 = 0,加入 → factor_sum = 6
- 第五步:d = 4、5 均不整除,不加
- 第六步:factor_sum = 6 = n,是完美數!印出 6
- 第七步:接著外層繼續,最終 n = 28 時同樣驗證,1+2+4+7+14 = 28,印出 28
老師的提示
外層 for n in range(1, N+1) 遍歷每個數;內層用 for d in range(1, n) 累加真因數,若不是因數就用 continue 跳過。最後比較總和是否等於 n。
最小質因數
問題情境:小瑤在數學課學到了質因數分解,老師說任何合數都可以拆成質數的乘積,而第一步就是要找出最小的質因數。小瑤想寫一支程式來幫她完成這件事:輸入一個整數 N,從 2 開始一個一個試除,第一個能整除 N 的數就是最小質因數,用 break 立刻停下並輸出它;如果從 2 一路試到 N-1 都沒有找到,表示 N 本身就是質數,這時應該輸出 N 自己。小瑤覺得這道題和「找到就停」的 break 邏輯完全吻合,正好可以拿來練習。
🔍 思考引導:
🔀 試著補完這張流程圖...
下面的流程圖有些步驟被
???遮住了,試著想想看遮住的地方應該填什麼:
輸入格式: 第一行:一個正整數 N(2 ≤ N ≤ 1000000)
輸出格式: 一行,印出 N 的最小質因數
範例一:
| 輸入 | 輸出 |
|---|---|
12 | 2 |
範例二:
| 輸入 | 輸出 |
|---|---|
35 | 5 |
範例三:
| 輸入 | 輸出 |
|---|---|
17 | 17 |
範例說明: 以 N = 35(範例二)為例:
- 第一步:d = 2,35 % 2 = 1 ≠ 0,繼續
- 第二步:d = 3,35 % 3 = 2 ≠ 0,繼續
- 第三步:d = 4,35 % 4 = 3 ≠ 0,繼續
- 第四步:d = 5,35 % 5 = 0,找到了!立刻
break,印出 5
老師的提示
從 2 開始嘗試整除 N,找到第一個能整除的數就 break 並輸出。如果跑完 2 到 N-1 都沒找到,表示 N 本身是質數,輸出 N。這道題最適合練習「找到就立刻 break」的思維。
到這裡,迴圈的三大工具你全部學完了:for(指定次數)、while(指定條件)、break/continue(中途控制)。你已經有足夠的武器來處理「重複」的問題了。但接下來有一個新問題:如果你要重複處理的不是「一層」,而是「重複裡面還有重複」呢?
下一節會教你巢狀迴圈(Nested Loop):把一個迴圈放進另一個迴圈裡,解決像「九九乘法表」、「圖案列印」這種需要兩個層次重複的問題。
本節小結
🎯 重點回顧:
break:在迴圈中途強制離開,不再執行剩下的輪次continue:跳過當前這一輪,直接進入下一輪- 兩者都可以在
for和while中使用 while True+break:當終止條件不容易寫在while後面時的常見模式- 注意:
while+continue要確保更新步驟在continue之前,否則無窮迴圈 - Trace Table 中用 🛑 和 ⏭ 標記 break 和 continue 的觸發點
📝 下一節:「巢狀迴圈」:
你已經能精細控制一層迴圈了。下一節要更進一步:把一個 for 迴圈放進另一個 for 迴圈裡——巢狀迴圈(Nested Loop)。從九九乘法表到各種圖案,凡是「行 × 列」結構的問題,它全都搞定。