<style> .markdown-body table{ display: unset; } </style> # APCS觀念題2016年10月 > 日期:2023年2月3日 > 作者:王一哲 1. 下列 F()函式執行後,輸出為何? (A) 1 2   (B) 1 3   \(C\) 3 2   (D) 3 3 ```c void F( ) { char t, item[] = {'2', '8', '3', '1', '9'}; int a, b, c, count = 5; for (a=0; a<count-1; a=a+1) { c = a; t = item[a]; for (b=a+1; b<count; b=b+1) { if (item[b] < t) { c = b; t = item[b]; } if ((a==2) && (b==3)) { printf ("%c %d\n", t, c); } } } } ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:由第12到14行可知,當 a = 2、b = 3時才會印出文字,當 a = 2 代入外層的 for 迴圈時,c = a = 2、t = item[2] = '3';進到內層的 for 迴圈,當 b = a+1 = 3 時,item[b] = item[3] = '1' < '3',第1個 if 的條件成立,因此 c = b = 3、t = item[b] = item[3] = '1';此時 a = 2、b = 3,第2個 if 的條件成立,印出 1 3,答案為B。 <br /><br /> 2. 下列 switch 敘述程式碼可以如何以 if-else 改寫? ```c switch (x) { case 10: y = 'a'; break; case 20: case 30: y = 'b'; break; default: y = 'c'; } ``` ```c (A) if (x==10) y = 'a'; if (x==20 || x==30) y = 'b'; y = 'c'; (B) if (x==10) y = 'a'; else if (x==20 || x==30) y = 'b'; else y = 'c'; (C) if (x==10) y = 'a'; if (x>=20 && x< =30) y = 'b'; y = 'c'; (D) if (x==10) y = 'a'; else if(x>=20 && x< =30) y = 'b'; else y = 'c'; ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:題目中的 switch 運作規則:當 x == 10 則 y = 'a' 並跳出 switch;若 x != 10 進到下一層,當 x == 20 或 x == 30 則 y = 'b' 並跳出 switch;若以上條件皆不成立則 y = 'c',因此答案為B。 <br /><br /> 3. 給定右側 G(), K() 兩函式,執行 G(3) 後所回傳的值為何? (A) 5   (B) 12   \(C\) 14   (D) 15 ```c int K(int a[], int n) { if (n >= 0) return (K(a, n-1) + a[n]); else return 0; } int G(int n){ int a[] = {5,4,3,2,1}; return K(a, n); } ``` <br /> <span style="font-weight:bold">答案</span>:C <span style="color:blue">詳解</span>:列出運作過程 $$ \begin{align*} g(3) &= K(a, 3)\\ &= K(a, 2) + a[3]\\ &= K(a, 1) + a[2] + a[3]\\ &= K(a, 0) + a[1] + a[2] + a[3]\\ &= K(a, -1) + a[0] + a[1] + a[2] + a[3]\\ &= 0 + 5 + 4 + 3 + 2\\ &= 14 \end{align*} $$ <br /><br /> 4. 下列程式碼執行後輸出結果為何? (A) 3   (B) 4   \(C\) 5   (D) 6 ```c int a=2, b=3; int c=4, d=5; int val; val = b/a + c/b + d/b; printf ("%d\n", val); ``` <br /> <span style="font-weight:bold">答案</span>:A <span style="color:blue">詳解</span>:由於 val 為整數 (int),b/a、c/b、d/b 計算結果只會留下整數部分,val = 3/2 + 4/3 + 5/3 回傳值為3。 <br /><br /> 5. 下列程式碼執行後輸出結果為何? (A) 2 4 6 8 9 7 5 3 1 9   (B) 1 3 5 7 9 2 4 6 8 9   \(C\) 1 2 3 4 5 6 7 8 9 9   (D) 2 4 6 8 5 1 3 7 9 9 ```c int a[9] = {1, 3, 5, 7, 9, 8, 6, 4, 2}; int n=9, tmp; for (int i=0; i<n; i=i+1) { tmp = a[i]; a[i] = a[n-i-1]; a[n-i-1] = tmp; } for (int i=0; i<=n/2; i=i+1) printf ("%d %d ", a[i], a[n-i-1]); ``` <br /> <span style="font-weight:bold">答案</span>:C <span style="color:blue">詳解</span>:第1個 for 迴圈如果只執行4次會將陣列a的元素前後對調,也就是第一個、最後一個對調,第二個、倒數第二個對調;但是總共執行了9次,最後會換回原來的樣子。第2個 for 迴圈執行5次,依序印出 a[0]、a[8],a[1]、a[7,]a[2]、a[6],a[3]、a[5],a[4]、a[4],也就是 1 2 3 4 5 6 7 8 9 9。 <br /><br /> 6. 下列函式以 F(7) 呼叫後回傳值為 12, 則 \<condition> 應為何? (A) a < 3   (B) a < 2   \(C\) a < 1   (D) a < 0 ```c int F(int a) { if ( <condition> ) return 1; else return F(a-2) + F(a-3); } } ``` <br /> <span style="font-weight:bold">答案</span>:D <span style="color:blue">詳解</span>:本題考函式的遞迴 (recursion),由於回傳值為12,代表 if 的條件需要成立12次,條件應為 a < 0,列出運作過程 $$ \begin{align*} F(7) &= F(5) + F(4)\\ &= [F(3) + F(2)] + [F(2) + F(1)]\\ &= [F(1) + F(0)] + [F(0) + F(-1)] + [F(0) + F(-1)] + [F(-1) + F(-2)] \\ &= [F(-1) + F(-2)] + 3 \times [F(-2) + F(-3)] + 3 \times F(-1) + F(-2)\\ &= 12 \end{align*} $$ <br /><br /> 7. 若 n 為正整數,下列程式三個迴圈執行完畢後 a 值將為何? (A) n(n+1)/2   (B) n<sup>3</sup>/2   \(C\) n(n-1)/2   (D) n<sup>2</sup>(n+1)/2 ```c int a=0, n; … for (int i=1; i<=n; i=i+1) for (int j=i; j<=n; j=j+1) for (int k=1; k<=n; k=k+1) a = a + 1; ``` <br /> <span style="font-weight:bold">答案</span>:D <span style="color:blue">詳解</span>:列出不同 i 值時,三層 for 迴圈分別運作的次數,並試著找出規律。 1. i = 1 時,中間層 $n$ 次,最內層 $n$ 次,共 $n^2$ 次 2. i = 2 時,中間層 $n-1$ 次,最內層 $n$ 次,共 $n(n-1)$ 次 3. i = 3 時,中間層 $n-2$ 次,最內層 $n$ 次,共 $n(n-2)$ 次 4. i = 4 時,中間層 $n-3$ 次,最內層 $n$ 次,共 $n(n-3)$ 次 5. i = n 時,中間層 1 次,最內層 $n$ 次,共 $n$ 次 a = a + 1 被運作次數為 $$ \begin{align*} N &= n^2 + n(n-1) + n(n-2) + n(n-3) + \dots + n\\ &= n[n + (n-1) + (n-2) + \dots + 1]\\ &= n \times \frac{(n+1) \times n}{2}\\ &= \frac{n^2 (n+1)}{2} \end{align*} $$ <br /><br /> 8. 下面哪組資料若依序存入陣列中,將無法直接使用二分搜尋法搜尋資料? (A) a, e, i, o, u   (B) 3, 1, 4, 5, 9   \(C\) 10000, 0, -10000   (D) 1, 10, 10, 10, 100 <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:若要使用二分搜尋法,資料必須先由小到大或由大到小排序。 <br /><br /> 9. 下列是依據分數 s 評定等第的程式碼片段,正確的等第公式應為: - 90~100 判為 A 等 - 80~89 判為 B 等 - 70~79 判為 C 等 - 60~69 判為 D 等 - 0~59 判為 F 等 這段程式碼在處理 0~100 的分數時,有幾個分數的等第是錯的? (A) 20   (B) 11   \(C\) 2   (D) 10 ```c if (s>=90) { printf ("A \n"); } else if (s>=80) { printf ("B \n"); } else if (s>60) { printf ("D \n"); } else if (s>70) { printf ("C \n"); } else { printf ("F\n"); } ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:70 ~ 79分符合第二個 else if 的條件,會被判斷為D;60分不符合第二個 else if 的條件,會進到最後的 else,會被判斷為F;總共11個。 <br /><br /> 10. 右側主程式執行完三次 G()的呼叫後,p 陣列中有幾個元素的值為 0? (A) 1   (B) 2   \(C\) 3   (D) 4 ```c int K (int p[], int v) { if (p[v]!=v) { p[v] = K(p, p[v]); } return p[v]; } void G (int p[], int l, int r) { int a=K(p, l), b=K(p, r); if (a!=b) { p[b] = a; } } int main (void) { int p[5]={0, 1, 2, 3, 4}; G(p, 0, 1); G(p, 2, 4); G(p, 0, 4); return 0; } ``` <br /> <span style="font-weight:bold">答案</span>:C <span style="color:blue">詳解</span>:列出 G(p, 0, 1) 運作流程: 1. a = K(p, 0) ⇒ p[0] == 0 ⇒ 回傳 0 2. b = K(p, 1) ⇒ p[1] == 1 ⇒ 回傳 1 3. 回到函式 G ⇒ a = 0, b = 1 ⇒ a != b ⇒ p[b] = a ⇒ p[1] = 0 4. 陣列 a = {0, 0, 2, 3, 4} 列出 G(p, 2, 4) 運作流程: 1. a = K(p, 2) ⇒ p[2] == 2 ⇒ 回傳 2 2. b = K(p, 4) ⇒ p[4] == 4 ⇒ 回傳 4 3. 回到函式 G ⇒ a = 2, b = 4 ⇒ a != b ⇒ p[b] = a ⇒ p[4] = 2 4. 陣列 a = {0, 0, 2, 3, 2} 列出 G(p, 0, 4) 運作流程: 1. a = K(p, 0) ⇒ p[0] == 0 ⇒ 回傳 0 2. b = K(p, 4) ⇒ p[4] != 2 ⇒ p[4] = K(p, 2) = 2 3. 回到函式 G ⇒ a = 0, b = 2 ⇒ a != b ⇒ p[b] = a ⇒ p[2] = 0 4. 陣列 a = {0, 0, 0, 3, 2} 共有3個0,答案為C。 <br /><br /> 11. 下列程式片段執行後,count 的值為何? (A) 36   (B) 20   \(C\) 12   (D) 3 ```c int maze[5][5] = {{1, 1, 1, 1, 1}, {1, 0, 1, 0, 1}, {1, 1, 0, 0, 1}, {1, 0, 0, 1, 1}, {1, 1, 1, 1, 1}}; int count=0; for (int i=1; i<=3; i=i+1) { for (int j=1; j<=3; j=j+1) { int dir[4][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}}; for (int d=0; d<4; d=d+1) { if (maze[i+dir[d][0]][j+dir[d][1]]==1) { count = count + 1; } } } } ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:如果直接列出所有的計算過程,會像下表這樣,很花時間。下表中 im = i+dir[d][0],jm = j+dir[d][1],當 maze[im][jm] == 1 時將 count 值加1,最終答案為20。 <div style="text-align:center"> <table> | i | j | d | im | jm | maze[im][jm] | count | |---|---|---|----|----|--------------|-------| | 1 | 1 | 0 | 0 | 1 | 1 | 1 | | 1 | 1 | 1 | 1 | 2 | 1 | 2 | | 1 | 1 | 2 | 2 | 1 | 1 | 3 | | 1 | 1 | 3 | 1 | 0 | 1 | 4 | | 1 | 2 | 0 | 0 | 2 | 1 | 5 | | 1 | 2 | 1 | 1 | 3 | 0 | 5 | | 1 | 2 | 2 | 2 | 2 | 0 | 5 | | 1 | 2 | 3 | 1 | 1 | 0 | 5 | | 1 | 3 | 0 | 0 | 3 | 1 | 6 | | 1 | 3 | 1 | 1 | 4 | 1 | 7 | | 1 | 3 | 2 | 2 | 3 | 0 | 7 | | 1 | 3 | 3 | 1 | 2 | 1 | 8 | | 2 | 1 | 0 | 1 | 1 | 0 | 8 | | 2 | 1 | 1 | 2 | 2 | 0 | 8 | | 2 | 1 | 2 | 3 | 1 | 0 | 8 | | 2 | 1 | 3 | 2 | 0 | 1 | 9 | | 2 | 2 | 0 | 1 | 2 | 1 | 10 | | 2 | 2 | 1 | 2 | 3 | 0 | 10 | | 2 | 2 | 2 | 3 | 2 | 0 | 10 | | 2 | 2 | 3 | 2 | 1 | 1 | 11 | | 2 | 3 | 0 | 1 | 3 | 0 | 11 | | 2 | 3 | 1 | 2 | 4 | 1 | 12 | | 2 | 3 | 2 | 3 | 3 | 1 | 13 | | 2 | 3 | 3 | 2 | 2 | 0 | 13 | | 3 | 1 | 0 | 2 | 1 | 1 | 14 | | 3 | 1 | 1 | 3 | 2 | 0 | 14 | | 3 | 1 | 2 | 4 | 1 | 1 | 15 | | 3 | 1 | 3 | 3 | 0 | 1 | 16 | | 3 | 2 | 0 | 2 | 2 | 0 | 16 | | 3 | 2 | 1 | 3 | 3 | 1 | 17 | | 3 | 2 | 2 | 4 | 2 | 1 | 18 | | 3 | 2 | 3 | 3 | 1 | 0 | 18 | | 3 | 3 | 0 | 2 | 3 | 0 | 18 | | 3 | 3 | 1 | 3 | 4 | 1 | 19 | | 3 | 3 | 2 | 4 | 3 | 1 | 20 | | 3 | 3 | 3 | 3 | 2 | 0 | 20 | </table> </div> <br /><br /> 高手鍾天睿提供了一個比較方便的作法。由於外層兩個 for 迴圈運作時,i、j 的值皆為 1、2、3,相當於對應到二維陣列 maze 中央的9個元素,而 dir[4][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}} 則會對應對某一個元素左、上、右、下的4個元素,所以只要以 maze 中央的9個元素為中心,各數一次左、上、右、下的4個元素有幾個是1,就可以數出答案。 $$ 4 + 1 + 3 + 1 + 2 + 2 + 3 + 2 + 2 = 20 $$ <br /><br /> 12. 下列程式片段執行過程中的輸出為何? (A) 5 10 15 20   (B) 5 11 17 23   \(C\) 6 12 18 24   (D) 6 11 17 22 ```c int a = 5; … for (int i=0; i<20; i=i+1){ i = i + a; printf ("%d ", i); } ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:for 迴圈每運作一次,i 的值會加6,這是因為 i = i + a 這行會使 i 的值加5,但是在 for 迴圈的增量條件中 i = i + 1 會使 i 的值加1,如果漏掉這項就會答錯,所以輸出為 5 11 17 23。 <br /><br /> 13. 若宣告一個字元陣列 char str[20] = "Hello world!";該陣列 str[12]值為何? (A) 未宣告   (B) \0   \(C\) !   (D) \n <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:字元陣列的結尾處為空字元 (null) '\0'。 <br /><br /> 14. 假設 x,y,z 為布林(boolean)變數,且 x=TRUE, y=TRUE, z=FALSE。請問下面各布林 運算式的真假值依序為何? (TRUE 表真, FALSE 表假) ```c !(y || z) || x !y || (z || !x) z || (x && (y || z)) (x || x) && z ``` (A) TRUE FALSE TRUE FALSE   (B) FALSE FALSE TRUE FALSE \(C\) FALSE TRUE TRUE FALSE   (D) TRUE TRUE FALSE TRUE <br /> <span style="font-weight:bold">答案</span>:A <span style="color:blue">詳解</span>:先處理最內層括號中的內容,再處理外層括號的內容。如果變數前方有驚嘆號,將這個變數的值反過來,再跟其它變數運算。如果沒有括號了,由左到右依序運算。四個運算式分別為 ```c !(y || z) || x = !(TRUE || FALSE) || TRUE = !TRUE || TRUE = FALSE || TRUE = TRUE !y || (z || !x) = !TRUE || (FALSE || !TRUE) = FALSE || (FALSE || FALSE) = FALSE || FALSE = FALSE z || (x && (y || z)) = FALSE || (TRUE && (TRUE || FALSE)) = FALSE || (TRUE && TRUE) = FALSE || TRUE = TRUE (x || x) && z = (TRUE || TRUE) && FALSE = TRUE && FALSE = FALSE ``` <br /><br /> 15. 下列程式片段執行過程的輸出為何? (A) 44   (B) 52   \(C\) 54   (D) 63 ```c int i, sum, arr[10]; for (int i=0; i<10; i=i+1) arr[i] = i; sum = 0; for (int i=1; i<9; i=i+1) sum = sum - arr[i-1] + arr[i] + arr[i+1]; printf ("%d", sum); ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:第一個 for 迴圈,將陣列 arr 依序填入 0、1、2、...、9。第二個 for 迴圈,會從 arr 中一次取出3個元素運算,共執行8次,列出加總 $$ \begin{align*} sum &= 0 - 0 + 1 + 2\\ &~~~~~~~- 1 + 2 + 3\\ &~~~~~~~- 2 + 3 + 4\\ &~~~~~~~- 3 + 4 + 5\\ &~~~~~~~- 4 + 5 + 6\\ &~~~~~~~- 5 + 6 + 7\\ &~~~~~~~- 6 + 7 + 8\\ &~~~~~~~- 7 + 8 + 9\\ &= 2 + 3 + 4 + 5 + 6 + 7 + 8 + 8 + 9\\ &= 52 \end{align*} $$ <br /><br /> 16. 下列程式片段中,假設 a, a_ptr 和 a_ptrptr 這三個變數都有被正確宣告,且呼叫 G() 函式時的參數為 a_ptr 及 a_ptrptr。G()函式的兩個參數型態該如何宣告? (A) (a) \*int, (b) \*int   (B) (a) \*int, (b) \*\*int   \(C\) (a) int\*, (b) int\*   (D) (a) int\*, (b) int\*\* ```c void G ( (a) a_ptr, (b) a_ptrptr) { … } void main () { int a = 1; // 加入 a_ptr, a_ptrptr 變數的宣告 … a_ptr = &a; a_ptrptr = &a_ptr; G (a_ptr, a_ptrptr); } ``` <br /> <span style="font-weight:bold">答案</span>:D <span style="color:blue">詳解</span>:由於變數 a 為整數,a_ptr = &a,是將 a 的位址指定給 a_ptr,因此 a_ptr 是指標變數,於 G() 函式中的參數要宣告為 int\* a_ptr。由於 a_ptrptr = &a_ptr,是將 a_ptr 的位址指定給 a_ptrptr,因此 a_ptrptr 是指標的指標,於 G() 函式中的參數要宣告為 int\*\* a_ptrptr。 <br /><br /> 17. 下列程式片段中執行後若要印出下列圖案,(a) 的條件判斷式該如何設定? (A) k > 2   (B) k > 1   \(C\) k > 0   (D) k > -1 ```c ****** **** ** ``` ```c for (int i=0; i<=3; i=i+1) { for (int j=0; j<i; j=j+1) printf(" "); for (int k=6-2*i; (a) ; k=k-1) printf("*"); printf("\n"); } ``` <br /> <span style="font-weight:bold">答案</span>:C <span style="color:blue">詳解</span>:當 i = 0 時,k 初始值為 6,要印出6個 \*;當 i = 1 時,k 初始值為 4,要印出4個 \*;當 i = 2 時,k 初始值為 2,要印出2個 \*;當 i = 3 時,k 初始值為 0,不會印出 \*;因此條件 (a) 為 k > 0,答案為C。 <br /><br /> 18. 給定下列 G()函式,執行 G(1)後所輸出的值為何? (A) 1 2 3   (B) 1 2 3 2 1   \(C\) 1 2 3 3 2 1   (D) 以上皆非 ```c void G (int a){ printf ("%d ", a); if (a>=3) return; else G(a+1); printf ("%d ", a); } ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:本題考函式的遞迴 (recursion),運作流程如下: 1. 第1層,G(1),印出1,呼叫 G(2) 2. 第2層,G(2),印出2,呼叫 G(3) 3. 第3層,G(3),印出3,遇到 return,結束遞迴。 4. 回到第2層,印出2。 5. 回到第1層,印出1。 輸出為 1 2 3 2 1,答案為B。 <br /><br /> 19. 下列程式碼是自動計算找零程式的一部分,程式碼中三個主要變數分別為 Total (購買總額), Paid (實際支付金額),Change (找零金額)。但是此程式片段有冗餘的程式碼,請找出冗餘程式碼的區塊。 (A) 冗餘程式碼在 A 區   (B) 冗餘程式碼在 B 區   \(C\) 冗餘程式碼在 C 區   (D) 冗餘程式碼在 D 區 ```c int Total, Paid, Change; … Change = Paid - Total; printf ("500 : %d pieces\n", (Change-Change%500)/500); Change = Change % 500; printf ("100 : %d coins\n", (Change-Change%100)/100); Change = Change % 100; // A 區 printf ("50 : %d coins\n", (Change-Change%50)/50); Change = Change % 50; // B 區 printf ("10 : %d coins\n", (Change-Change%10)/10); Change = Change % 10; // C 區 printf ("5 : %d coins\n", (Change-Change%5)/5); Change = Change % 5; // D 區 printf ("1 : %d coins\n", (Change-Change%1)/1); Change = Change % 1; ``` <br /> <span style="font-weight:bold">答案</span>:D <span style="color:blue">詳解</span>:經過C區運算後,Change 為 0 ~ 4 之間的整數,等於要找零的1元硬幣數量,D區改成下列程式碼即可。 ```c printf ("1 : %d coins\n", Change); ``` <br /><br /> 20. 下列程式執行後輸出為何? (A) 0   (B) 10   \(C\) 25   (D) 50 ```c int G (int B) { B = B * B; return B; } int main () { int A=0, m=5; A = G(m); if (m < 10) A = G(m) + A; else A = G(m); printf ("%d \n", A); return 0; } ``` <br /> <span style="font-weight:bold">答案</span>:D <span style="color:blue">詳解</span>:程式運作流程如下 1. A = G(5) = 5<sup>2</sup> = 25 2. m = 5,符合 m < 10 的條件,進到 if 區段。 3. A = G(5) + 25 = 25 + 25 = 50 4. 印出 A 的值 50 因此答案為D。 <br /><br /> 21. 下列 G()應為一支遞迴函式,已知當 a 固定為 2, 不同的變數 x 值會有不同的回傳值如下表所示。請找出 G()函式中 (a) 處的計算式該為何? (A) ((2\*a)+2) \* G(a, x - 1)        (B) (a+5) \* G(a-1, x - 1) \(C\) ((3\*a)-1) \* G(a, x - 1)        (D) (a+6) \* G(a, x - 1) ```c int G (int a, int x) { if (x == 0) return 1; else return (a) ; } ``` <br /> <div style="text-align:center"> <table> | a 值 | x 值 | G(a, x) 回傳值 | |-----|-----|----------------| | 2 | 0 | 1 | | 2 | 1 | 6 | | 2 | 2 | 36 | | 2 | 3 | 216 | | 2 | 4 |1296 | | 2 | 5 |7776 | </table> </div> <span style="font-weight:bold">答案</span>:A <span style="color:blue">詳解</span>:由表格中可以看出 G(a, x) 回傳值為 6<sup>x</sup>,所以選項的左側用 a = 2 代入後等於6,且右側應為 G(a, x-1),故答案為A。 <br /><br /> 22. 如果 $X_n$ 代表 $X$ 這個數字是 $n$ 進位,請問 $\mathrm{D02A_{16} + 5487_{10}}$ 等於多少? (A) $1100~0101~1001~1001_{2}$   (B) $162631_8$   \(C\) $58787_{16}$   (D) $\mathrm{F599_{16}}$ <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:本題考進位制的換算。若將題目及選項的數值皆換成10進位制,則題目給的數值 $$ \begin{align*} \mathrm{D02A_{16}} + 5487 &= [13 \times 16^3 + 13 \times 16 + 2 \times 16 + 10] + 5487\\ &= [13 \times 4096 + 32 + 10] + 5487\\ &= [53248 + 32 + 10] + 5487\\ &= 53290 + 5487\\ &= 58777 \end{align*} $$ A選項 $$ \begin{align*} \mathrm{1100~0101~1001~1001_2} &= 2^{15} + 2^{14} + 2^{10} + 2^8 + 2^7 + 2^4 + 2^3 + 1\\ &= 32768 + 16384 + 1024 + 256 + 128 + 16 + 8 + 1\\ &= 50585 \end{align*} $$ B選項為正確答案 $$ \begin{align*} \mathrm{162631_8} &= 1 \times 8^5 + 6 \times 8^4 + 2 \times 8^3 + 6 \times 8^2 + 3 \times 8 + 1\\ &= 32768 + 6 \times 4096 + 2 \times 512 + 6 \times 64 + 3 \times 8 + 1\\ &= 32768 + 24576 + 1024 + 384 + 24 + 1\\ &= 58777 \end{align*} $$ C選項,5位數、16進位制,遠大於題目給的數值,作答時可以直接刪除。 $$ \begin{align*} 58787_{16} &= 5 \times 16^4 + 8 \times 16^3 + 7 \times 16^2 + 8 \times 16 + 7\\ &= 5 \times 65536 + 8 \times 4096 + 7 \times 256 + 8 \times 16 + 7\\ &= 327680 + 32768 + 1792 + 128 + 7\\ &= 362375 \end{align*} $$ D選項 $$ \begin{align*} \mathrm{F599_{16}} &= 15 \times 16^3 + 5 \times 16^2 + 9 \times 16 + 9\\ &= 15 \times 4096 + 5 \times 256 + 9 \times 16 + 9\\ &= 61440 + 1280 + 144 + 9\\ &= 62873 \end{align*} $$ 如果使用 Python,可以用以下的程式碼驗算,int() 中的第1個參數是要被轉換成整數的字串,第2個參數是使用的進位制。 ```python print("target: ", int("D02A", 16) + 5487) print("A: ", int("1100010110011001", 2)) print("B: ", int("16231", 8)) print("C: ", int("58787", 16)) print("D: ", int("F599", 16)) ``` <br /><br /> 23. 請問下列程式,執行完後輸出為何? (A) 2417851639229258349412352 7   (B) 68921 43   \(C\) 65537 65539   (D) 134217728 6 ```c int i=2, x=3; int N=65536; while (i <= N) { i = i * i * i; x = x + 1; } printf ("%d %d \n", i, x); ``` <br /> <span style="font-weight:bold">答案</span>:D <span style="color:blue">詳解</span>:while 迴圈每運作一次,會將 i 的值變成原來的 3 次方,並且將 x 的值加1,題目給定 i = 2、x = 3、N = 65536 = 2<sup>16</sup>,while 迴圈運作流程如下: 1. 第1次:輸入 i = 2、x = 3,輸出 i = 2<sup>3</sup> = 8、x = 4 2. 第2次:輸入 i = 8、x = 4,輸出 i = 8<sup>3</sup> = 2<sup>9</sup> = 512、x = 5 3. 第3次:輸入 i = 512、x = 5,輸出 i = 512<sup>3</sup> = 2<sup>27</sup> = 134217728、x = 6,跳出迴圈。 故答案為D。 <br /><br /> 24. 下列 G()為遞迴函式,G(3, 7)執行後回傳值為何? (A) 128   (B) 2187   \(C\) 6561   (D) 1024 ```c int G (int a, int x) { if (x == 0) return 1; else return (a * G(a, x - 1)); } ``` <br /> <span style="font-weight:bold">答案</span>:B <span style="color:blue">詳解</span>:本題考函式的遞迴 (recursion),列出運作流程 $$ \begin{align*} G(3, 7) &= 3 \times G(3, 6) = 3^2 \times G(3, 5) = 3^3 \times G(3, 4) = 3^4 \times G(3, 3)\\ &= 3^5 \times G(3, 2) = 3^6 \times G(3, 1) = 3^7 \times G(3, 0)\\ &= 3^7 \times 1 = 2187 \end{align*} $$ <br /><br /> 25. 下列函式若以 search (1, 10, 3) 呼叫時,search 函式總共會被執行幾次? (A) 2   (B) 3   \(C\) 4   (D) 5 ```c void search (int x, int y, int z) { if (x < y) { t = ceiling ((x + y)/2); if (z >= t) search(t, y, z); else search(x, t - 1, z); } } 註: ceiling()為無條件進位至整數位。例如 ceiling(3.1)=4, ceiling(3.9)=4。 ``` <br /> <span style="font-weight:bold">答案</span>:C <span style="color:blue">詳解</span>:運作流程如下: 1. 第1次,呼叫 search(1, 10, 3),x < y,得到 t = 6;z < t,呼叫 search(1, 5, 3)。 2. 第2次,呼叫 search(1, 5, 3),x < y,得到 t = 3;z == t,呼叫 search(3, 5, 3)。 3. 第3次,呼叫 search(3, 5, 3),x < y,得到 t = 4;z < t,呼叫 search(3, 3, 3)。 4. 第4次,呼叫 search(3, 3, 3),x == y,停止運作。 答案為C。 <br /><br /> --- ###### tags:`APCS`、`C`、`C++`、`Python`