公務人員特種考試計算機大意112 年第 31 題單選題
下列是 C 語言的函式 mm,請問呼叫 mm(mm(20, 30), 21)會回傳多少?
int mm(int x, int y)
{ /*assume x>=1 && y>=1 */
int i, max=x*y;
for(i = x; i <=max; i++)
if(i%x==0 && i%y==0)
return i;
}
C正確答案
mm(x,y) 回傳 x,y 的最小公倍數 (LCM)。先算 mm(20,30)=60,再算 mm(60,21)=420。
為什麼答案是 C
mm(20,30):找 [20,600] 中同時被 20、30 整除的最小數 = 60。再 mm(60,21):LCM(60,21)=420(60=2²·3·5, 21=3·7, LCM=2²·3·5·7=420)。
載入中…
完整詳解
Pro · 無限重點 mm(x,y) 回傳 x,y 的最小公倍數 (LCM)。先算 mm(20,30)=60,再算 mm(60,21)=420。
看懂迴圈:從 x 到 x*y 找第一個同時被 x、y 整除的數 → 就是 LCM(x,y)。
逐選項分析
A✕
1 不會是結果,因為迴圈從 i=x 開始,且 x>=1,最小回傳值至少是 x 本身。
B✕ 陷阱
20 只是第一次呼叫的參數之一,不是 LCM(20,30)=60,更不是最終答案。看到 20 就選是陷阱。
C✓ 正確
mm(20,30):找 [20,600] 中同時被 20、30 整除的最小數 = 60。再 mm(60,21):LCM(60,21)=420(60=2²·3·5, 21=3·7, LCM=2²·3·5·7=420)。
D✕ 陷阱
1260 是 60×21 的乘積,若誤以為函式回傳 x*y(即 max 值)會選此。但迴圈會提早 return 最小公倍數。
函式 mm 執行追蹤
| 呼叫 | x | y | 回傳(LCM) |
|---|
| mm(20,30) | 20 | 30 | 60 |
| mm(60,21) | 60 | 21 | 420 |
| 最終結果 | - | - | 420 |
很多考生看到 max=x*y 就以為函式回傳 x*y(乘積 1260),忽略了 for 迴圈中的 return 會提早結束。實際上這是求 LCM 的經典寫法,回傳的是迴圈找到的第一個公倍數。