APCS 11101 筆試
===
![](http://mirrors.creativecommons.org/presskit/buttons/88x31/png/by-nc-sa.png =100x)
[CC 姓名標示─非商業性─相同方式分享](https://creativecommons.org/licenses/by-nc-sa/3.0/tw/legalcode)
## 筆試第一場
#### 1. 陣列、row major
```cpp=
int s1[2][2] = {0, 1, 2, 3};
int s2[2][2] = {4, 3, 2, 1};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++)
printf("%d ", s1[i][j] * s2[j][i]);
printf("\n");
}
```
詢問輸出結果
#### 2. 陣列
```cpp=
for (int i = 0; i < 100; i++)
a[i] = 0, s[i] = 0;
s[0] = 1;
for (int i = 0; i < 100; i++) {
int index = i / 50;
s[i] = s[i] + s[a[index]];
}
printf("%d", s[50]);
```
詢問輸出結果
#### 3. 加奇數 index
```cpp=
int sum = 0;
for (int i = 0; i < n; i++) {
if (i % 2 == 0)
sum = sum + (-arr[i]);
sum = sum + arr[i];
}
printf("%d\n", sum);
```
詢問輸出結果
#### 4. 4 的倍數
```cpp=
void func(int n, int m) {
int arr[100];
int tail = 0;
for (int i = 1; i <= n; i++) {
arr[tail] = i;
tail = tail + 1;
}
int head = -1, count = 0;
while (tail > head + 1) {
count = count + 1;
head = head + 1;
if (count == m) {
arr[tail] = arr[head];
count = 0;
tail = tail + 1;
}
}
return arr[head];
}
func(30, 4)
```
詢問回傳結果
(A) 18
(B) 14
\(C\) 30
(D) 24
#### 5. 選擇排序法(Selection Sort)
:::success
您好請問這一題 是要問func(a, 4)嗎 填充答案是多少啊 謝謝您
:::
```cpp=
void func(int a[], int n) {
int target = a[n], j;
for (__1__; (a[j - 1] > target) && __2__; __3__) {
a[j] = a[j - 1];
}
a[j] = target;
}
int main(){
int a[5] = {16, 18, 19, 20, 17};
func(a, 4);
for (int i = 0; i <= 4; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
```
詢問輸出結果
#### 6. Bubble Sort 但寫反
```cpp=
int main(){
int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
int n = 9;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (a[j] > a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
```
詢問輸出結果
#### 7. 迴圈
```cpp=
int a[] = {0, 1, 5, 4, 5, 4, 5};
int n = 7, i, key = 5, F = 0;
for (i = 0; i < n; i++) {
if (a[i] == key) {
F = i;
__?__;
}
}
```
若 F 為 2,____ 要填啥
(A) break
(B) continue
\(C\) i++
(D) i--
#### 8. Binary Search
```cpp=
void func(int x) {
int a = {0, 2, 15, 20, 25, 30}, i = 0, j = 6;
do {
int m = (i + j) / 2;
if (a[m] == x)
break;
if (a[m] < x)
i = m;
else
j = m;
} while (i + 1 < j);
}
```
問 func(3), func(15), func(4) `int m = (i + j) / 2` call 了幾次
#### 9. 變數 scope
```cpp=
int a = 30;
void b() {
int a = 20;
}
int main() {
int a = 10;
b();
for (int i = 0; i < 3; i++)
printf ("%d ", a);
}
```
詢問輸出結果
#### 10. Boolean 變數
如果 `!x1 && !x2 && !x3` 為 True 且 x1 為 False, 問 x2 和 x3 應該為多少
#### 11. gcd / lcm 相關
```cpp=
int g(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
int f(int a, int b) {
return a * b / g(a, b);
}
int main() {
printf("%d", f(10, 20));
}
```
詢問輸出結果
#### 12. 帕斯卡三角形相關
```cpp=
int pas[6] = {1};
for (int i = 0; i < 6; i++) {
int prev = 0;
for (int j = 0; __1__; j++) {
tmp = pas[j];
pas[j] = __2__ + tmp;
prev = tmp;
}
}
```
填空
(A) j < i - 1, pas[j]
(B) j < i + 1, pas[j - 1];
\(C\) j < i - 1, pas[j - 1];
(D) j < i + 1, pas[j]
#### 13. 遞迴
```cpp=
void f(int x, int y) {
if (x == 0) return y;
else return f(x - 1, x + y)
}
int main() {
printf("%d\n", f(100, 10));
}
```
詢問輸出結果
#### 14. 遞迴、switch 條件控制
```cpp=
int k(int n) {
switch(n) {
case 0: return n;
case 1: return n + k(n / 2);
default: return n + k(n / 4);
}
return n;
}
int main() {
printf("%d\n", k(30));
}
```
詢問輸出結果
#### 15. 數學、迴圈
```cpp=
int x = -100;
for (int i = 1; i <= 8; i++)
for (int j = 1; j <= i; j++)
for (int k = 1; k <= j; k++)
x += 1;
printf("%d", x)
```
詢問輸出結果
#### 16. 多層函式呼叫、scope
```cpp=
int f(int a) {
return -a;
}
int g(int a, int b) {
return a + 2 * b;
}
int h(int a, int b) {
return (!a) * b;
}
int main() {
int out_a = 1, out_b = 1;
if (!f(g(h(out_b, out_a), out_a)))
out_a = 1;
else
out_b = 1;
if (out_b == 1)
out_a = 3;
else
out_b = 3;
printf("%d %d", out_a, out_b);
return 0;
}
```
詢問輸出結果
#### 17. 變數型別
```cpp=
void func() {
int b = 10, i;
double a = 47;
for (i = 0; i < 10; i++) {
b = a / b;
printf("%d", b);
}
}
```
(a) i 偶數輸出 4
(b) i 奇數輸出 11
(A) 兩個都對
(B) 兩個都錯
\(C\) 只對 (a)
(D) 只對 (b)
#### 18. 可能回傳的數值
```cpp=
int func(int n) {
if (n > 10)
n = n + 5;
while (n < 12)
n = n + 1;
if (n == 14)
n = 5;
return n;
}
```
詢問 func(n) 不可能會回傳什麼數值
(A) 15
(B) 16
\(C\) 17
(D) 18
#### 19. 變數賦值
```cpp=
int a = 1, b = 2, c = 3;
a = b;
b = c;
c = a;
```
問 a, b, c 的值
#### 20. 函式
下段程式碼為檢查一個 array 內的數字是否連續, 例如 {5, 3, 4, 2, 6} 完美覆蓋 2 ~ 6,而 {3, 5, 2, 6, 7} 缺 4
```cpp=
const int MAXN = 1e5;
int f(int a[], int n) {
int iMax = a[0];
for (int i = 1; i < n; i++)
if (a[i] > iMax)
iMax = a[i];
int iMin = a[0];
for (int i = 1; i < n; i++)
if (a[i] > iMin)
iMin = a[i];
int ok = 1;
if (iMax - iMin == n) {
int cnt[MAXN] = {};
for (int i = 0; i < n; i++) {
if (cnt[a[i]] == 1)
__1__;
cnt[a[i]] = 1;
}
if (ok)
__2__;
}
__3__;
}
```
(A)
ok = 0,
return 1,
return 0
(B)
return 1,
ok = 0,
return 0
\(C\)
return 0,
ok = 0,
return 1
(D)
return 1,
return 0,
ok = 0
## 筆試第二場
#### 1. 遞迴、2進制
```cpp=
void func(int n) {
if (n > 0) {
printf ("%d", n % 2);
func(n / 2);
}
}
func(21)
```
詢問回傳結果
#### 2. 遞迴(先遞迴、後遞迴)
```cpp=
void func(int n) {
printf("%d ", 2 * n);
if (n < 4)
func(n + 1);
printf("%d ", 2 * n - 1);
}
func(2)
```
詢問輸出結果
#### 3. 遞迴
```cpp=
int f(int i) {
if (i % 3 != 0) {
if (i == 1 || i > 50)
return 5;
else
return i + f(i + 1);
} else
return f(i + 2);
}
f(3);
```
詢問輸出結果
#### 4. 遞迴、帕斯卡三角形
```cpp=
int p(int n, int k) {
if (k == 0)
return 1;
else if (k == 1)
return n;
else
return n * p(n - 1, k - 1);
}
p(5, 4);
```
詢問輸出結果
#### 5. 迴圈、星星
```
***1*****
**3******
*5*******
7********
```
```cpp=
int n = 4;
for (int i = 0; i < n; i++) {
for (int j = 0; j < 10; j++) {
if (j < n - i - 1 || j > ____) {
printf("*")
} else {
printf("%d", 2 * i + 1)
}
}
}
```
填空程式碼
#### 6. 數學
問 f(1000) 和 f(49999) 回傳是 6 和 10,___ 填多少
```cpp=
int f(int n) {
int sum = 0;
while (n) {
n = n - n % 5;
______
n = n / 5;
}
return sum;
}
```
(A) isZero = isZero - n / 5
(B) isZero = isZero + n / 5
\(C\) isZero = isZero + n / 6
(D) isZero = isZero + n % 6
#### 7. 迴圈、矩陣翻轉
```cpp=
int a[3][3] = {};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j)
a[i][j] = i + j;
else
a[i][j] = 0;
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
printf("%d ", a[j][i]);
printf("\n");
}
```
詢問輸出結果
#### 8. 迴圈, 印三角形, 有空行
```cpp=
void func(int f) {
while (f) {
f = f - 1;
int a = 4;
for (int i = 1; i <= a; i++) {
for (int j = 0; j < i; j++)
printf("%d", i);
printf("\n");
}
for (int i = a - 1; i >= 1; i--) {
for (int j = 0; j < i; j++)
printf("%d", i);
printf("\n");
}
if (f) printf("\n");
}
}
func(2);
```
詢問輸出結果
#### 9. 迴圈
要實作一個加總 $1 - \frac{1}{4} + \frac{1}{7} - \frac{1}{11} + ...$ 的程式, 空格應填入
```cpp=
double x = 0, y = 1;
int i = 1, n = 10;
while (n--) {
_______;
y = -y;
_______;
}
```
填空
(A) x = x + y / i, i = i + 3
#### 10. Selection Sort
由大到小排
```cpp=
void func(int a[], int n) {
int t;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (___) {
___
}
}
}
}
```
(A)
a[i] < a[j]
t = a[i];
a[i] = a[j];
a[j] = t;
(B)
a[i] > a[j]
t = a[i];
a[i] = a[j];
a[j] = t;
\(C\)
a[i] < a[j]
t = a[i];
a[j] = a[i];
a[i] = t;
(D)
a[i] > a[j]
t = a[i];
a[j] = a[i];
a[i] = t;
#### 11. Merge Sort 相關
填空
```cpp=
void func(int a[], int an, int b[], int bn) {
int ai = 0, bi = 0, c[200], ci = 0;
for (; (ai < an && bi < bn); ____) {
if (____) {
c[i] = a[ai];
ai = ai + 1;
} else {
c[i] = b[bi];
bi = bi + 1;
}
}
}
```
(A) ci = ci + 1, a[ai] <= b[bi]
#### 12. scope
```cpp=
double a = 1.0;
const double b = 2.0;
int sw(double a, double b) {
return a + b;
}
int main() {
double b = 3.0;
b = sw(a, b);
a = a + 1.0;
printf("%.2f %.2f", a, b);
}
```
#### 13. 條件判斷
規則
1. 40 以下免稅
2. 40 ~ 100 稅率 0.1
3. 100 ~ 150 稅率 0.25
4. 超過部分 稅率 0.3
```cpp=
int f(int pay) {
if (pay <= 40)
return 0;
if (pay <= 100)
return (pay - 40) * 0.1
if (pay <= 150)
return pay * 0.2;
return (pay - 150) * 0.3 + 12.5 + 6;
}
```
以上是錯的,要如何更改
(A) 第 4 和 6 行要變成 else if
(B) 第 7 行為 `pay * 0.25 - 19`
\(C\) 第 7 行為 `(pay - 100) * 0.25 + 10`
(D) 第 7 行為 `(pay - 100) * 0.25 + 14`
#### 14. queue
```cpp=
int main() {
int Q[5];
int i, j, loc = 0;
while(scanf("%d%d", &i, &j) == 2) {
if (i == 1) {
for (int i = loc; i > 0; i--) {
Q[i] = Q[i - 1];
Q[0] = j;
}
loc++;
}
else if (i == 2) {
Q[loc - 1] = 0;
loc = loc - 1;
}
}
for (int i = 0; i < 5; i++)
printf("%d ", Q[i]);
}
```
若輸入為 `1 1 1 2 1 4 1 1 1 2 2 3 2 1`,輸出為何
(A) 2 1 4 0 0
#### 15. boolean
```cpp=
void logic(int i, int j, int k) {
int m[4] = {}, c = 0;
m[c] = (i + k <= j);
c = c + 1;
// 不重要
}
logic(1, 5, 4);
```
(A)
(B)
\(C\) 1011
(D)
#### 16. 字串相關
```cpp=
char a[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'};
for (int i = 0; i < 9; i++)
a[i] = a[i] + i * 2;
```
下列何者是對的
(A) a[2] = 'd'
(B) a[4] = 'm'
\(C\) a[6] = 't'
(D) a[8] = 'x'
#### 17. 字串相關
問下列怎麼填可輸出 bababb
```cpp=
char s[] = {'a', 'b', 'a', 'b', 'a', 'a'};
void f(char x) {
for (int i = 0; i < 7; i++) {
______
else s[i] = x;
}
}
int main() {
f('a');
for (int i = 0; i < 7; i++)
printf("%c", s[i]);
}
```
(A) if (s[i] == c) s[i] = s[i] + 1;
#### 18. 函式
```cpp=
int f1(int a, int b) {
if (___)
return b * 2;
else
return a * b;
}
int f2(int a, int b) {
for (int i = 0; i < b; i++)
a = a + i * 2;
return a;
}
int main() {
int a = 3, b = 2, c = 1;
c = f1(a, b);
a = f2(a, c);
printf("%d %d", a, c)
}
```
若輸出為 10, 6 則空白應填入
(A) a + 2 < b
:::info
- 語法 / 流程控制
- if else
- switch
- 迴圈
- 變數
- 全域變數, 區域變數
- int 運算
- 陣列
- 字串
- 迴文判斷
- 進階語法
- 指標
- struct
- macro
- 函式、遞迴函式
- 數學
- gcd
- 篩法
- 帕斯卡三角形
- 費氏數列
- $a^n$
- 算法
- 氣泡排序法
- 二分搜
- 複雜度
- top-down dp
- 資料結構
- stack
- queue
:::