moea_joint
111年
[資訊] 計算機原理、網路概論
第 23 題
下列C語言程式片段中,若a=36,b=45,執行結果為何?
```c
main ()
{
int a,b,r;
while(b!=0)
{
r=a%b;
a=b;
b=r;
}
printf("result=%d\n",a);
}
```
```c
main ()
{
int a,b,r;
while(b!=0)
{
r=a%b;
a=b;
b=r;
}
printf("result=%d\n",a);
}
```
- A 6
- B 7
- C 8
- D 9
思路引導 VIP
如果在紙上模擬這段程式的運行,當你看到變數不斷地進行「取餘數」並將舊的除數變成新的被除數時,這讓你聯想到數學課中學過的哪一種求取「特定數值關係」的方法?當餘數最後變成 0 時,最後留下來的那個非零除數,對原本的兩個數字來說代表什麼意義?
🤖
AI 詳解
AI 專屬家教
輾轉相除法與迴圈追蹤
看到你精準地選出 (D),代表你對於程式迴圈的邏輯追蹤以及變數交換的掌握非常紮實!這段程式碼實作的是電腦科學中非常經典的輾轉相除法(Euclidean Algorithm),其核心目的是找出兩數的最大公因數。在程式執行過程中,系統會不斷計算 $a \pmod b$ 的餘數 $r$,並將 $b$ 的值賦予 $a$,再將餘數 $r$ 賦予 $b$。透過這種不斷「縮小規模」的迭代,直到餘數為 $0$ 時,當前的 $a$ 即為所求。 以本題 $a=36, b=45$ 為例,第一次進入迴圈時 $r = 36 \pmod{45} = 36$,隨後變數更新為 $a=45, b=36$;第二次迴圈 $r = 45 \pmod{36} = 9$,變數更新為 $a=36, b=9$;最後一次 $r = 36 \pmod 9 = 0$,此時 $b$ 變為 $0$ 滿足跳出條件,最終輸出的 $a$ 即為 $9$。這題的鑑別度在於考察學生是否能冷靜處理「除數大於被除數」的初始狀態,只要細心追蹤第一次交換後的數值變化,就能順利破題,是基本功非常好的表現!