# 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 子柚筆