W03|讓程式重複嘗試:for迴圈、篩選與窮舉
今天完成後,我可以
- 使用
for與range()讓程式依序處理一段整數。 - 知道
range()包含開始值,但不包含結束界線。 - 把
if放入迴圈,只處理符合條件的數字。 - 使用窮舉法逐一嘗試所有可能,找出符合條件的答案。
- 看懂「同一行輸入兩個整數」的基本寫法。
一、快速恢復 for 與 range()
先不要執行,預測下面的程式會輸出什麼:
第1個輸出:____
最後一個輸出:____
一共輸出:____個數字
range(1, 6)包含 1,但不包含 6。
如果省略「每次增加量」,預設每次增加 1。
二、課中練習
2-1|b032 小朋友學數數(30分)
題目依序輸入開始值、結束值與間隔值。輸出從開始值到結束值(包含兩者)的所有數字,每次增加指定間隔,每個數字各占一行。題目保證「結束值-開始值」可被間隔值整除。
動手前先回答
若輸入為:
11
31
4
- 第一個輸出是多少?
- 第二個輸出是多少?
- 最後一個輸出是多少?
- 一共會輸出幾個數字?
提示一:怎樣讓range()包含結束值?
range()不包含結束界線。把結束界線寫成end + 1,就能讓本題保證會走到的end也被包含在範圍內。
提示二:程式骨架
進入第二題前:把條件判斷放入迴圈
迴圈可以依序產生很多數字,if可以從中挑出符合條件的數字。例如,只輸出1到10之間的偶數:
閱讀時可以分成兩個問題:
for:現在要檢查哪些可能?if:目前這個可能符合條件嗎?
2-2|b016 雞兔同籠(70分)
已知雞兔的總隻數與總腳數,請找出雞和兔各有幾隻。
答案要在同一行輸出雞、兔兩個數字,並以空白分隔;忘記寫法時可查閱輸入輸出技巧|同一行使用空白分隔。
這次不使用聯立方程式直接推導,而是讓電腦把每一種可能依序試過一次。這種方法稱為「窮舉」。
先用小資料實際嘗試
假設共有 5 隻動物、14 隻腳:
| 雞 | 兔 | 總隻數 | 算出的總腳數 | 符合嗎? |
|---|---|---|---|---|
| 0 | 5 | 5 | 20 | 否 |
| 1 | 4 | 5 | __ | __ |
| 2 | 3 | 5 | __ | __ |
| 3 | 2 | 5 | __ | __ |
| 4 | 1 | 5 | __ | __ |
| 5 | 0 | 5 | 10 | 否 |
窮舉的步驟
讓雞從0隻開始逐一嘗試
→ 兔子隻數 = 總隻數 - 雞隻數
→ 算出目前組合的總腳數
→ 若腳數符合,就輸出雞與兔的隻數
提示一:要嘗試到哪裡?
別忘了「全部都是兔子」和「全部都是雞」也可能是答案,因此雞可能是 0 到總隻數。
提示二:窮舉骨架
三、課後挑戰:從篩選走向計數與加總
時間不夠時,建議依序完成b017 → a034 → a036,最後再挑戰b018;這樣能先準備好下週會用到的計數與加總。
| 題目 | 配分 | 定位 | 本週目標 |
|---|---|---|---|
b017 找因數 |
15 分 | 基礎必做 | 逐一檢查並輸出符合條件的數字 |
b018 韓信點兵 |
20 分 | 核心練習 | 同時檢查三個取餘數條件 |
a034 我愛偶數 |
25 分 | 自學:計數 | 每找到一個偶數,就把數量加一 |
a036 我也愛偶數 |
40 分 | 自學:加總 | 每找到一個偶數,就把它加入總和 |
3-1|b017 找因數
從 1 到 n逐一檢查。如果 n除以目前數字的餘數是 0,目前數字就是因數。
逐一產生可能的因數
→ 用 % 檢查餘數
→ 符合時才輸出
3-2|b018 韓信點兵
題目給定最少人數與最多人數,請逐一檢查範圍內的每個人數。三個餘數條件必須同時成立,可以使用 and連接。
提示:先分別寫出三個條件
除以3餘2
除以5餘3
除以7餘2
把三個條件分別翻譯成 Python,再用 and連接。
課後共用工具:同一行輸入兩個整數
a034和a036的兩個整數寫在同一行,中間以空白分隔,例如:
2 10
不要執行兩次 input()。請依照「讀入、切開、轉型」三個步驟:
資料的變化如下:
讀入 "2 10"
→ split()切成 "2" 與 "10"
→ int()轉成整數2與整數10
精簡寫法等之後熟悉資料轉換再學,本週先使用上面的基本寫法。
3-3|a034 我愛偶數——計數
題目不是要輸出每一個偶數,而是要回答「一共有幾個」。因此要準備一個變數保存目前找到的數量。
數量一開始是0
→ 逐一檢查a到b的每個整數
→ 找到偶數時,數量增加1
→ 全部檢查完成後,輸出數量
提示:計數骨架
本週使用迴圈解題,得到90分就代表已達成計數練習目標。最後一筆測資會顯示TLE(執行超時),這是預期中的結果。剩下的10分需要用數學方法避開很長的迴圈,現在不必先學。
3-4|a036 我也愛偶數——加總
這次不是數「有幾個偶數」,而是把找到的偶數加起來。
請先比較:
| 任務 | 變數起始值 | 找到偶數時 |
|---|---|---|
| 計數 | count = 0 |
把 count增加 1 |
| 加總 | total = 0 |
把 number加入 total |
提示:從計數程式修改
保留 a034的輸入、迴圈與偶數判斷,只修改:
- 用哪個變數保存答案。
- 找到偶數時,要加上
1還是加上目前的number。 - 最後要輸出哪個變數。
四、完成後自我檢查
- 我的
for下一行有縮排。 - 我知道
range()不包含結束界線,能讓範圍包含題目指定的最後一個數字。 - 我能分辨
for負責產生可能,if負責檢查條件。 - 我能用
%判斷整除或餘數條件。 - 我知道同一行有兩個整數時,只執行一次
input(),再使用split()切開。 - 窮舉時,我有檢查
0和最大值是否也可能是答案。 - 計數與加總的起始值寫在迴圈前,最後答案寫在迴圈後輸出。
- 我能說明「計數加
1」與「加總加number」的不同。
