<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`