# APCS觀念題(原創)
本篇題目皆為原創,如題目有疑義歡迎聯絡~
聯絡方式:codecodefunny@gmail.com
---
## 20250630
```cpp=
char c1='K';
char c2='O';
string s1 = "N";
string s2 = s1+c2;
cout << c1 << " " << c2+c1 << " " << s2;
```
(A)K 154 157
(B)K 154 NO
(C)K KO NO
(D)編譯錯誤
<details> <summary>解答</summary>
(B)
</details>
<details>
<summary>詳解</summary>
字元 'K',對應的 ASCII 編碼值是 75;字元 'O',對應的 ASCII 編碼值是 79。<br>
c1 是 'K'<br>
c2 + c1 是「字元 + 字元」,當作整數處理:<br>
所以 c2 + c1 = 79 + 75 = 154<br>
s2 是「字串 + 字元」,C++ 會自動把 'O' 轉成 "O" 進行字串串接<br>
所以結果是 `"NO"`
</details>
## 20250701
呼叫 `f(4)` 的輸出結果為何?
```cpp=
void f(int n) {
if (n <= 1) {
cout << n;
return;
}
cout << n;
f(n - 1);
cout << n;
}
```
(A)4 3 2 1 2 3 4
(B)4 3 2 1
(C)1 2 3 4
(D)1 2 3 4 3 2 1
<details> <summary>解答</summary>
(A)
</details>
<details>
<summary>詳解</summary>
呼叫 f(4)<br>
n = 4,判斷 n <= 1 不成立,輸出 4<br>
呼叫 f(3),這時不會執行第 8 行,而是先處理 f(3)<br>
n = 3,判斷 n <= 1 不成立,輸出 3<br>
呼叫 f(2)<br>
n = 2,判斷 n <= 1 不成立,輸出 2<br>
呼叫 f(1)<br>
n = 1,判斷 n <= 1 成立,輸出 1<br>
f(1) return 回到 f(2),執行 第 8 行,輸出 2<br>
f(2) return 回到 f(3),執行 第 8 行,輸出 3<br>
f(3) return 回到 f(4),執行 第 8 行,輸出 4<br>
f(4) return,程式結束
</details>
## 20250702
呼叫 `f(3)` 的輸出結果為何?
```cpp
int h(int n) {
if (n) return n * h(n - 1);
else return 1;
}
int g(int n) {
if (n % 2) return 1;
else return h(2 * n);
}
int f(int n) {
if (n >= 1) return g(n) + f(n - 1);
else return 0;
}
```
(A)6
(B)720
(C)26
(D)24
<details> <summary>解答</summary>
(C)
</details>
<details>
<summary>詳解</summary>
呼叫 f(3),依序執行:<br>
f(3) 會回傳 g(3) + f(2)。<br>
g(3),因為 3 % 2 != 0,所以 return 1。<br>
f(2) 會回傳 g(2) + f(1)。<br>
g(2),因為 2 % 2 == 0,所以 return h(4)。<br>
h(4) = 4 * h(3) = 4 * 3 * h(2) = 4 * 3 * 2 * h(1) = 4 * 3 * 2 * 1 * h(0) = 24 * 1 = 24。<br>
g(2) = 24,所以 f(2) = 24 + f(1)。<br>
f(1) 會回傳 g(1) + f(0)。<br>
g(1) = 1,f(0) 不執行,所以 f(1) = 1。<br>
f(2) = 24 + 1 = 25。<br>
f(3) = 1 + 25 = 26。<br>
</details>
---
## 20250703
下列程式執行結束後,`count` 的值為多少?
```cpp=
int n = 8;
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
for (int k = j; k < n; k++) {
count++;
}
}
}
```
(A)120
(B)720
(C)240
(D)5040
<details> <summary>解答</summary>
(A)
</details>
<details>
<summary>詳解</summary>
i 從 0 到 7,j 從 i 到 7,k 從 j 到 7。<br>
依序計算:<br>
i=0:j=0~7,k=j~7,共 36 次。<br>
i=1:j=1~7,k=j~7,共 28 次。<br>
i=2:j=2~7,k=j~7,共 21 次。<br>
i=3:j=3~7,k=j~7,共 15 次。<br>
i=4:j=4~7,k=j~7,共 10 次。<br>
i=5:j=5~7,k=j~7,共 6 次。<br>
i=6:j=6~7,k=j~7,共 3 次。<br>
i=7:j=7,k=j~7,共 1 次。<br>
總和 36 + 28 + 21 + 15 + 10 + 6 + 3 + 1 = 120。<br>
</details>
---
## 20250704
下列輸出結果何者正確?
```cpp=
int main() {
int a = 0, b = 1, c = 2;
if (c == b || a && !c || b) {
printf("A");
}
if (1 && a || b && !c) {
printf("B");
}
if (!(0 || a) && !c || !(a && b)) {
printf("C");
}
}
```
(A)AB
(B)BC
(C)AC
(D)C
<details> <summary>解答</summary>
(C)
</details>
<details>
<summary>詳解</summary>
0 = false,正整數 = true<br>
所以,a = false,b = true, c = true<br><br>
|| 代表或者,兩者其一成立即為 true,反之為 false<br>
&& 代表且,兩者皆成立即為 true,反之為 false<br><br>
if (c == b || a && !c || b)<br>
先拆解成((c == b) 或 (a 且 (!c 或 b))),注意括號層數<br>
(c == b)為 true,任一者成立,整體為 true,印出 A。<br><br>
if (1 && a || b && !c):條件為 false,不執行。<br>
先拆解成((1 且 a) 或 (b 且 非c))<br>
a = false,故(1 且 a)為 false;c = true,非c = false,故(b 且 非c)為 false,兩者皆不成立,整體為 false。<br><br>
if (!(0 || a) && !c || !(a && b))<br>
先拆解成((非(0 或 a) 且 非c) 或 非(a 且 b))<br>
分析後段比較簡單,a = false,b = true,故(a 且 b)為 false,非(a 且 b)為 true,任一者成立,整體為 true,印出 C。<br>
</details>
---
## 20250705
呼叫 `f(11)` 的回傳值是?
```cpp=
int f(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return f(n - 1) + f(n - 2);
}
```
(A)89
(B)144
(C)55
(D)233
<details> <summary>解答</summary>
(B)
</details>
<details>
<summary>詳解</summary>
容易看出,這是費氏數列,第 1 項為 1,第 2 項為 2,求第 11 項。<br>
1 2 3 5 8 13 21 34 55 89 144<br>
故答案為 144
</details>
---
## 20250706
以下程式的輸出結果是?
```cpp=
int main() {
bool a[100];
for (int i = 0; i < 100; i++) {
a[i] = i;
}
int n = 0;
while (n < 100) {
if (n % 2 == 0) a[n] = !a[n];
n++;
}
while (n >= 0) {
if (n % 3 != 0) a[n] = !a[n];
n--;
}
int sum = 0;
for (int i = 0; i < 100; i++) {
if (a[i]) sum++;
}
printf("%d\n", sum);
}
```
(A)50
(B)51
(C)67
(D)34
<details> <summary>解答</summary>
(B)
</details>
<details>
<summary>詳解</summary>
a[i] = i,所以 a[i] 初始為 0,1,2,...,99,因為是 bool 陣列,所以只有首項為 false<br>
第一個 while 迴圈會將偶數索引的 a[i] 取反,此時所有偶數項為 false,首項為 true<br>
每六項進行分析,進入第二個 while 迴圈前為 FTFTFT,首六項為 TTFTFT<br>
第二個 while 迴圈會將 i % 3 != 0 的索引 a[i] 取反<br>
每六項進行分析,變成 FFTTTF,首六項為 TFTTTF<br>
最後要輸出 true 的個數,100/6=16.66,首六項單獨計算,故 (16-1)*3=45,加上首六項有 4 個,再加上倒數 4 項有 2 個,共 51 個
</details>
---
## 20250707
呼叫 `f(63172,3)` 的輸出結果是?
```cpp=
int f(int n, int k) {
int prev = -1;
while (n != prev) {
prev = n;
int a = 0;
while (n > 0) {
a += pow((n % 10), k);
n /= 10;
}
n = a;
}
return n;
}
```
(A)371
(B)370
(C)153
(D)63172
<details> <summary>解答</summary>
(B)
</details>
<details>
<summary>詳解</summary>
這段程式會重複以下操作,直到數字不再變化為止:<br>
1. 把 `n` 的每一位數取出<br>
2. 每位數做 `k` 次方(此處是 3 次方),然後加總<br>
3. 將加總結果指定給 `n`,重複步驟直到收斂(出現重複的數字)<br><br>
呼叫 `f(63172, 3)`:<br>
- 6³ + 3³ + 1³ + 7³ + 2³ = 216 + 27 + 1 + 343 + 8 = **595**<br>
- 5³ + 9³ + 5³ = 125 + 729 + 125 = **979**<br>
- 9³ + 7³ + 9³ = 729 + 343 + 729 = **1801**<br>
- 1³ + 8³ + 0³ + 1³ = 1 + 512 + 0 + 1 = **514**<br>
- 5³ + 1³ + 4³ = 125 + 1 + 64 = **190**<br>
- 1³ + 9³ + 0³ = 1 + 729 + 0 = **730**<br>
- 7³ + 3³ + 0³ = 343 + 27 + 0 = **370**<br>
- 3³ + 7³ + 0³ = 27 + 343 + 0 = **370**(重複了!)<br>
</details>
---
## 20250708
下列哪一個條件式可用於印出如下的三角形圖案?
```
*
***
*****
*******
```
```cpp=
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 7; j++) {
if ( _________ )
cout << "*";
else
cout << " ";
}
cout << endl;
}
```
(A)j >= i && j <= 6 - i
(B)j >= 0 && j <= 2 * i
(C)j >= 3 - (i % 2) && j <= 3 + (i % 2)
(D)j >= 3 - i && j <= 3 + i
<details> <summary>解答</summary>
(D)
</details>
<details>
<summary>詳解</summary>
將選項帶入題目中,觀察該印出星星的位置是否有印出來,可得答案為(D)
</details>
---
## 20250709
下列輸出結果何者正確?
```cpp=
int a = 6;
double f(double b) {
return a + b;
}
int main() {
double b = 7.5;
for (a = 3; a >= 0; a--) {
b += 2.5;
}
b += f(a);
printf("%d,%.1f\n", a, b);
return 0;
}
```
(A)-1,15.5
(B)0,15.0
(C)6,29.5
(D)-1,23.0
<details> <summary>解答</summary>
(A)
</details>
<details> <summary>詳解</summary> 這段程式碼包含一個全域變數 a = 6,並定義了一個 f(double b) 函式會回傳 a + b。
主程式進行以下步驟:
初始化區域變數 b 為 7.5。
for (a = 3; a >= 0; a--) 這裡會修改全域變數 a 的值,從 3 開始每次減 1,到 0 為止(共 4 次),每次迴圈 b += 2.5:
a = 3 → b = 7.5 + 2.5 = 10.0
a = 2 → b = 10.0 + 2.5 = 12.5
a = 1 → b = 12.5 + 2.5 = 15.0
a = 0 → b = 15.0 + 2.5 = 17.5
跳出迴圈後,a 會變成 -1(因為最後一次迴圈結束後再執行 a--)。
接著 b += f(a);,這裡 a = -1,所以 f(-1) 等於 a + (-1),也就是 -1 + (-1) = -2.0。
b = 17.5 + (-2.0) = 15.5
printf("%d,%.1f\n", a, b); 輸出 -1,15.5。
</details>
---
## 20250710
下列程式碼如果依序輸入 1 2 3,輸出結果何者正確?
```c=
int a[5] = {5, 4, 3, 2, 1};
int index = 0;
void pop() {
printf("%d ", a[--index]);
a[index] = 0;
}
int main() {
scanf("%d", &a[index++]);
scanf("%d", &a[index++]);
pop();
scanf("%d", &a[index++]);
pop();
pop();
}
```
(A)4 3 5
(B)2 3 1
(C)3 2 4
(D)3 2 1
<details> <summary>解答</summary>
(B)
</details>
<details>
<summary>詳解</summary>
一開始陣列是:`a = {5, 4, 3, 2, 1}`
`index = 0`,每次 `a[index++]` 會往後填值,`--index` 會倒退來印出。
輸入:1 2 3
1. a[0] = 1(index = 1)
2. a[1] = 2(index = 2)
3. `pop()` → index 變 1 → 印出 a[1] = 2,清空
4. a[1] = 3(index = 2)
5. `pop()` → index 變 1 → 印出 a[1] = 3,清空
6. `pop()` → index 變 0 → 印出 a[0] = 1,清空
所以輸出是:`2 3 1`
</details>
---
## 20250711
下列程式碼執行結果,何者正確?
```c=
int teleport[6] = {0, 3, 2, 2, 1, 5};
int end_pos = 5;
int steps = 2;
int pos = 0;
while (pos != end_pos) {
pos += steps;
while(teleport[pos] != pos){
pos = teleport[pos];
}
}
```
(A)無窮迴圈
(B)停在 index 5
(C)停在 index 2
(D)停在 index 0
<details> <summary>解答</summary>
(A)
</details>
<details> <summary>詳解</summary> 初始 pos = 0,steps = 2,每次迴圈會先 pos += 2,然後反覆套用 teleport[pos],直到 teleport[pos] == pos。<br><br>
執行流程如下:
pos = 0 + 2 = 2
→ teleport[2] = 2(等於 pos),跳出內層 while
→ pos ≠ end_pos (5),繼續外層迴圈
pos = 2 + 2 = 4
→ teleport[4] = 1(≠4)→ pos = 1
→ teleport[1] = 3(≠1)→ pos = 3
→ teleport[3] = 2(≠3)→ pos = 2
→ teleport[2] = 2 → 跳出內層
→ pos ≠ end_pos (5),繼續
pos = 2 + 2 = 4 → 又回到剛剛的狀況,會重複
這段會在 2 → 4 → 1 → 3 → 2 之間循環,無法結束,陷入無窮迴圈。
</details>
---
## 20250712
下列輸出結果,何者正確?
```c=
int arr[10]={1,2,3,4,5,6,7,8,9,10}
int count=0;
int binarySearch(int left, int right, int target) {
count++;
if (left > right)
return -1;
int mid = left + (right - left) / 2;
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
return binarySearch(mid + 1, right, target);
else
return binarySearch(left, mid - 1, target);
}
int main(){
binarySearch(0,9,6);
printf("%d", count);
}
```
(A)1
(B)2
(C)3
(D)4
<details> <summary>解答</summary>
(C)
</details>
<details> <summary>詳解</summary> 目標值為 6,arr 是遞增陣列,進行 binarySearch(二分搜),並統計呼叫次數: <br><br>1. 第一次:left=0, right=9 → mid=4 → arr[4]=5 → 小於 target → 搜右半邊 <br>2. 第二次:left=5, right=9 → mid=7 → arr[7]=8 → 大於 target → 搜左半邊 <br>3. 第三次:left=5, right=6 → mid=5 → arr[5]=6 → 找到,return<br>
總共遞迴呼叫了 3 次,count=3。
</details>
---
## 20250713
`a` 陣列經過排序後,原本位在 `a[0]` 的 1,會換到哪個位置?
```c=
int a[5]={1,1,1,1,1};
for(int i = 0; i < 5; i++){
int biggest = a[i];
int index = i;
for(int j = i; j < 5; j++){
if(a[j] >= biggest){
index = j;
biggest = a[j];
}
}
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
```
(A)`a[0]`
(B)`a[1]`
(C)`a[3]`
(D)`a[4]`
<details> <summary>解答</summary>
(B)
</details>
<details> <summary>詳解</summary> 這是選擇排序的實作方式,每次選最大值往前放。<br> 原本 `a[0] = 1`,但因為陣列中全都是 `1`,`index` 每次都會往右更新成最後符合條件的 `j`。<br><br>
第一次迴圈中,index = 4,會交換 a[0] 和 a[4],所以原本的 a[0] 移動到 a[4]<br>
第二次,index = 4(值仍為 1),交換 a[1] 和 a[4] → 原本的 a[0](現在在 a[4])會被移動到 a[1]<br>
第三次往後都不會再跟 index 1有關連,所以,原本在 a[0] 的 1,最後會在 a[1]。
</details>
---
## 20250714
下列程式碼輸出結果是?
```c=
int num[8] = {0, 0, 1, 0, 0, 1, 1, 0};
for (int i = 1; i < 7; i += 2) {
num[i] = num[i - 1] || num[i + 1];
}
int sum = 0;
for (int i = 0; i < 8; i++) {
sum = sum * 2 + num[i];
}
printf("%d", sum);
```
(A)38
(B)34
(C)126
(D)118
<details> <summary>解答</summary>
(D)
</details>
<details> <summary>詳解</summary>
從原始 num = {0, 0, 1, 0, 0, 1, 1, 0} 開始:
i = 1:num[1] = 0 || 1 = 1
i = 3:num[3] = 1 || 0 = 1
i = 5:num[5] = 0 || 1 = 1
所以修改後:num = {0, 1, 1, 1, 0, 1, 1, 0}
計算成二進位(從左至右):
01110110 → 十進位為 118
</details>
---
## 20250715
下列程式碼輸出結果為何?
```c=
int a[11] = {0,1,2,3,4,5,6,7,8,9,10};
int sum = 0;
for (int i = 0, j = 1; i < 11; i += j, j++) {
sum += a[i];
}
printf("%d\n", sum);
}
```
(A)1
(B)4
(C)10
(D)20
<details> <summary>解答</summary>
(D)
</details>
<details> <summary>詳解</summary> 每次 i 的遞增幅度會越來越大(因為 i += j, j++):
第一次:i = 0, j = 1 → sum += a[0] = 0
第二次:i = 1, j = 2 → sum += a[1] = 1
第三次:i = 3, j = 3 → sum += a[3] = 3
第四次:i = 6, j = 4 → sum += a[6] = 6
第五次:i = 10, j = 5 → sum += a[10] = 10
第六次:i = 15 超過陣列範圍,跳出
總和為:0 + 1 + 3 + 6 + 10 = 20
</details>
---
## 20250716
呼叫 `f(5,3)` 的輸出結果為何?
```c=
int f(int x, int y) {
if (x == 1 || y == 1) return 1;
if (y > x) return y + f(x, y - 1);
else return x + f(x - 1, y);
}
```
(A)13
(B)16
(C)9
(D)18
<details> <summary>解答</summary>
(D)
</details>
<details> <summary>詳解</summary> 呼叫 f(5,3),進入遞迴如下:
f(5,3) → 5 + f(4,3)
f(4,3) → 4 + f(3,3)
f(3,3) → 3 + f(2,3)
f(2,3) → 3 + f(2,2)
f(2,2) → 2 + f(1,2)
f(1,2) 符合 x == 1 → 回傳 1
向上加總:
1 → 2+1=3 → 3+3=6 → 3+6=9 → 4+9=13 → 5+13=18
最終結果為 18。
</details>
---
## 20250717
呼叫 `gcd(174,78)` 的結果是?
```c=
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
```
(A)2
(B)3
(C)6
(D)13
<details> <summary>解答</summary>
(C)
</details>
<details> <summary>詳解</summary> 這是一個使用輾轉相除法的 GCD 函式:
gcd(174,78)
→ 174 % 78 = 18,更新為 gcd(78,18)
→ 78 % 18 = 6,更新為 gcd(18,6)
→ 18 % 6 = 0,更新為 gcd(6,0)
此時 b = 0,回傳 a = 6。
最大公因數為 6。
</details>
---
## 20250720
請問程式碼輸出結果為何?
```c=
int a[7] = {1, 2, 3, 4, 5, 6, 7};
int b[7] = {1, 2, 3, 4, 5, 6, 7};
int isEqual(int a[], int b[], int n) {
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) return 0;
}
return 1;
}
int main() {
int index = 0, n = 0;
do {
int temp = b[index];
b[index] = b[(index + 2) % 7];
b[(index + 2) % 7] = temp;
index = (index + 2) % 7;
n++;
} while (!isEqual(a, b, 7));
printf("%d\n", n);
}
```
(A)7
(B)14
(C)42
(D)70
<details> <summary>解答</summary>
(C)
</details>
---
## 20250721
`share(0,1)` 的輸出結果是?
```c=
void share(bool x, bool y) {
if (x && y) {
printf("平分");
}
else if (!x && y) {
printf("x獨得");
}
else if (x && !y) {
printf("y獨得");
}
else {
printf("都沒有");
}
}
```
(A)平分
(B)x獨得
(C)y獨得
(D)都沒有
<details> <summary>解答</summary>
(B)
</details>
---
## 20250722
若下列程式碼輸出結果為 3,則底線處的程式碼可能是下列何者?
```c=
int a[5][5] = {
{0, 1, 0, 0, 1},
{1, 0, 1, 0, 1},
{0, 0, 0, 0, 0},
{1, 1, 0, 0, 1},
{0, 0, 0, 0, 0}
};
int sum = 0;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (_________) sum++;
}
}
printf("%d\n", sum);
```
(A)a[i-1][j]
(B)a[i+1][j]
(C)a[i][j-1]
(D)a[i][j+1]
<details> <summary>解答</summary>
(D)
</details>
---
## 20250723
執行下列程式後,會出現下列何種結果?
```c=
int a[5][5] = {
{0, 0, 1, 0, 0},
{1, 0, 1, 0, 0},
{0, 0, 0, 1, 0},
{1, 1, 0, 0, 0},
{0, 0, 0, 1, 0}
};
int nowx = 0, nowy = 0;
int endx = 4, endy = 4;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = { 0, 1, 0, -1};
int dir = 1;
while (nowx != endx || nowy != endy) {
int nx = nowx + dx[dir];
int ny = nowy + dy[dir];
if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5 && a[nx][ny] == 0) {
nowx = nx;
nowy = ny;
}
else {
dir = (dir + 1) % 4;
}
}
printf("到終點了");
```
(A)無窮迴圈
(B)輸出"到終點了"
(C)編譯錯誤
(D)記憶體區段錯誤
<details> <summary>解答</summary>
(A)
</details>
---
聯絡方式:codecodefunny@gmail.com
最後編修時間:2025/07/22 子柚筆