Skip to content

迴圈控制:break 與 continue

上一節你學了 while 迴圈:跑到條件不成立為止。加上更早學的 for 迴圈,你現在有兩種讓電腦重複做事的工具了。

但你有沒有覺得,目前的迴圈有點「死板」?你只能等條件自然變成 False 才能離開,或是等 range() 跑完才停。如果你在迴圈跑到一半的時候,已經找到你要的東西了呢?或者某一輪遇到了不想處理的情況,想直接跳到下一輪呢?

今天要教的兩個指令,就是讓你對迴圈有「精細控制」的武器。

📷 圖 6:break 像煞車、continue 像快轉的四格漫畫(AI 製圖)

📷 圖 6:break 像煞車、continue 像快轉的四格漫畫(AI 製圖)

💡 📋 學習目標

看完這一節,希望你將能夠:

  1. break 在迴圈中途強制離開
  2. continue 跳過當前這一輪,直接進入下一輪
  3. forwhile 兩種迴圈中都能使用 break 和 continue
  4. 用 Trace Table 追蹤 break/continue 觸發時的迴圈狀態
  5. 解兩道 Judge 題 (ノ◕ヮ◕)ノ*:・゚✧

先從比較直覺的那個開始:break。你可以把它想成迴圈的「緊急煞車」。

break:迴圈的緊急煞車

為什麼需要 break?

為什麼用「煞車」來比喻?因為 break 跟開車煞車的邏輯一模一樣:你本來在跑,突然碰到了某個狀況,決定「不跑了」,直接停車下來。

想像你在教室裡點名,從 1 號點到 40 號。但你其實只是要找「小明」,找到他就不用繼續點了。沒有 break 的話,你得把 40 個人全點完才能停。有了 break,點到小明那一瞬間就可以喊「找到了,停!」

在 for 迴圈中使用 break

來看實際的程式碼。假設我們想找出 1 到 10 之中,第一個能被 3 整除的數字:

python
for i in range(1, 11):
    if i % 3 == 0:
        print("找到了:", i)
        break

輸出:

找到了: 3

Trace Table:

第幾次ii % 3 == 0動作
11繼續
22繼續
33印出 3,break 🛑

迴圈原本要跑 10 次,但第 3 次就觸發 break,直接跳出迴圈。第 4 到第 10 次完全不執行。

在 while 迴圈中使用 break

breakwhile 裡也一樣好用。一個經典的用法是搭配 while True(永遠為真的條件),再用 break 手動控制何時離開:

python
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 製圖)

📷 圖 7:教室點名找小明用 break 停止的概念圖(AI 製圖)

Judge 解題實戰:第一個因數

學完 break,來用它解一道 Judge 題:

題目說明

  • Input:一行輸入,一個正整數 N(N ≥ 4)
  • Output:N 的最小因數(不含 1 和 N 本身)

範例

InputOutput
122
153

老師的建議

先試試看!提示:從 2 開始往上找,找到第一個能整除 N 的就是答案。

卡關了再看解答!

Step 1:分析 IPO

  • I(Input):讀取正整數 N
  • P(Process):從 2 開始依序檢查每個數字,找到第一個 N % i == 0 的 i
  • O(Output):印出那個 i

找到第一個就停,不用再繼續找。完美的 break 場景。

Step 2:寫出程式碼

從 2 開始找,找到就停。翻譯成 Python:

python
n = int(input())
for i in range(2, n):
    if n % i == 0:
        print(i)
        break

逐行解讀:

  1. n = int(input()) — 讀取正整數 N
  2. for i in range(2, n): — 從 2 到 N-1 逐一檢查
  3. if n % i == 0: — 如果 i 能整除 N
  4. print(i) — 印出這個因數
  5. break — 立刻離開迴圈,不再繼續找

以 N = 12 為例的 Trace Table:

第幾次i12 % i == 0動作
12✅ (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

範例一

輸入輸出
abc
3
xyz
abc
OK

範例二

輸入輸出
abc
2
x
y
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。

範例一

輸入輸出
104

範例二

輸入輸出
11

範例說明

  • 第一步: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 的倍數:

python
for i in range(1, 11):
    if i % 3 == 0:
        continue
    print(i)

輸出:

1
2
4
5
7
8
10

Trace Table:

第幾次ii % 3 == 0動作輸出
11正常執行1
22正常執行2
33continue(跳過)
44正常執行4
55正常執行5
66continue(跳過)
...............
1010正常執行10

注意:continue 不會結束迴圈,只是跳過 continue 後面的程式碼,直接進入下一次迭代。

在 while 迴圈中使用 continue

continuewhile 裡也能用,但要特別小心:

python
i = 0
while i < 5:
    i = i + 1
    if i == 3:
        continue
    print(i)

輸出:

1
2
4
5

⚠️ while + continue 的陷阱

while 迴圈裡用 continue 時,一定要確保更新條件的程式碼在 continue 之前。否則 continue 會跳過更新步驟,造成無窮迴圈。

python
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 製圖)

📷 圖 8:continue 像批改跳過白卷的概念圖(AI 製圖)

Judge 解題實戰:跳過倍數

來用 continue 解一題:

題目說明

  • Input:兩行輸入,第一行正整數 N,第二行正整數 K
  • Output:印出 1 到 N 之間所有「不是 K 的倍數」的數字

範例

InputOutput
10
3
1
2
4
5
7
8
10

老師的建議

先自己挑戰看看!提示:遇到 K 的倍數就 continue

Step 1:分析 IPO

  • I(Input):讀取 N 和 K
  • P(Process):從 1 到 N 逐一檢查,遇到 K 的倍數就跳過
  • O(Output):印出不是 K 倍數的數字

Step 2:寫出程式碼

遇到倍數就跳過,其餘照印。程式碼:

python
n = int(input())
k = int(input())
for i in range(1, n + 1):
    if i % k == 0:
        continue
    print(i)

逐行解讀:

  1. n = int(input()) — 讀取 N
  2. k = int(input()) — 讀取 K
  3. for i in range(1, n + 1): — 從 1 到 N
  4. if i % k == 0: — 如果 i 是 K 的倍數
  5. continue — 跳過這一輪,不印出
  6. 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 倍數的整數之和。

範例一

輸入輸出
1040

範例二

輸入輸出
510

範例說明

  • 第一步: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 == 0continue,這樣後面的累加那行就不會被執行到。其他邏輯和普通的累加器一模一樣。


跳零位數和

問題情境:阿磊對數字很著迷,他在研究一個規律:把一個整數的每一位數字加起來,但遇到 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 的各位數中非零數字的總和。

範例一

輸入輸出
10348

範例二

輸入輸出
1001

範例說明

  • 第一步: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 就是質數。她打算在社團發表時用這支程式現場測試給大家看。

🔍 思考引導

💭 如果用數學來表達...

N 是質數d{2,3,,N1} 使得 Nmodd=0

換句話說,只要在 2 到 N-1 之間找到任何一個 d,使得 N÷d 整除(餘數為 0),N 就不是質數。你只需要找到「第一個」這樣的 d,找到了就能立刻下結論——這正是 break 的用武之地。

🔀 試著補完這張流程圖...

下面的流程圖有些步驟被 ??? 遮住了,試著想想看遮住的地方應該填什麼:

輸入格式: 第一行:一個正整數 N(2 ≤ N ≤ 100000)

輸出格式: 如果 N 是質數,印出 Yes;否則印出 No

範例一

輸入輸出
17Yes

範例二

輸入輸出
15No

範例說明: 以 N = 15 為例(範例二):

  • 第一步:d = 2,15 % 2 = 1 ≠ 0,繼續
  • 第二步:d = 3,15 % 3 = 0,找到因數!
  • 第三步:立刻 break,印出 No,不再繼續試其他數字

老師的提示

從 2 到 N-1 嘗試整除,找到第一個因數就立刻印 Nobreak。如果迴圈自然跑完(沒有觸發 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. 第一步 — 遍歷候選數:用外層迴圈從 1 到 N,逐一取出每個數字當作候選者
  2. 第二步 — 計算真因數之和:對每個候選數,用內層迴圈從 1 試到它自己 -1,把能整除它的數字加起來
  3. 第三步 — ???:你覺得算完真因數總和之後,下一步要做什麼判斷?
  4. 第四步 — ???:符合條件的數字要怎麼輸出?

🔀 試著補完這張流程圖...

下面的流程圖有些步驟被 ??? 遮住了,試著想想看遮住的地方應該填什麼:

輸入格式: 第一行:一個正整數 N(6 ≤ N ≤ 500)

輸出格式: 每行一個完美數,從小到大排列。

範例一

輸入輸出
306
28

範例二

輸入輸出
5006
28
496

範例說明: 以 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 的最小質因數

範例一

輸入輸出
122

範例二

輸入輸出
355

範例三

輸入輸出
1717

範例說明: 以 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:跳過當前這一輪,直接進入下一輪
  • 兩者都可以在 forwhile 中使用
  • while True + break:當終止條件不容易寫在 while 後面時的常見模式
  • 注意while + continue 要確保更新步驟在 continue 之前,否則無窮迴圈
  • Trace Table 中用 🛑 和 ⏭ 標記 break 和 continue 的觸發點

📝 下一節:「巢狀迴圈」:

你已經能精細控制一層迴圈了。下一節要更進一步:把一個 for 迴圈放進另一個 for 迴圈裡——巢狀迴圈(Nested Loop)。從九九乘法表到各種圖案,凡是「行 × 列」結構的問題,它全都搞定。