下列程序段中,所有未有列出宣告 (declaration) 的變量,均假設已經適當地宣告;而整數 (integer/int) 及長整數 (longint/long) 則分別為 16 位元及 32 位元有符號的整數。假設所有程序都正確地編譯,且沒有使用任何編譯器選 項(除C 程序的"-o"選擇外)。
符號
對於任何實數x,
(1)
x 表示不大於x 的最大整數;
(2)
x 表示不小於x 的最小整數。甲部
請為下列每題各選一個最適合的答案,然後把答案的字母 (A、B、C、D) 寫到答題紙對應的空格中。
1. 問由X 到 Y 共有多少種不同的走法?
A. 8 B. 7 C. 6 D. 5
2. 設 p 為奇數,且 p 與 q 並非互質。下列哪個/哪些敍述必定正確?
A. q 為奇數。
B. q 並非 2 的冪數。
C. q 並非 p 的冪數。
D. p 並非 q 的冪數。
3. 在一 N N 的迷宮內,每格只可能為空格或障礙物。小明希望在迷宮內每一個空格都填上 X 。以下哪個/
哪些策略並不正確?
(i) 對每一行由最左至最右檢查每一格。若是空格便在當中填 X 。
(ii) 先找一個空格並在當中填 X ,然後不斷在已填格子相鄰的格子找未填的空格並在當中填 X ,直至迷宮 內再没有未填的空格。
A. 只有 (i) B. 只有 (ii) C. (i) 和 (ii) D. 以上皆非
4. 細閱下列程序段:
Pascal 版本 x^ := 10;
y^ := 11;
z^ := 12;
y^ := z^;
x := z;
z^ := 13;
C 版本
*x = 10;
*y = 11;
*z = 12;
*y = *z;
x = z;
*z = 13;
上述程序段運行後,下列哪個/哪些布爾表達式的值為真?
Pascal 版本
(i) x^ = 12 (ii) x^ = 13 (iii) y^ = 13
C 版本
(i) *x == 12 (ii) *x == 13
(iii) *y == 13
A. 只有 (i) B. 只有 (ii) C. 只有 (i) 和 (iii) D. 只有 (ii) 和 (iii)
5. 下列函數的目的為何?(假設 n 為正數。)
Pascal 版本
function f(n : integer) : integer;
var
i, a, s : integer;
begin
if n = 1 then f := 1 else begin s := 0;
a := f(n-1);
for i := 1 to n do s := s + a;
f := s;
end;
end;
C 版本
int f(int n){
if (n == 1) return 1;
int s = 0;
int a = f(n-1);
int i;
for (i = 1; i <= n; ++i)
s = s + a;
return s;
}
A. 求 n! 的值 B. 求 (n+1)! 的值 C. 求第 n 個斐波那契數 D. 求 1 + 2 + 3 + ... + n 的值
6. 若一個排序算法維持鍵值相等的紀錄的相對次序,我們稱這個排序算法為「穩定的」。下列哪個排序算法並 不穩定?
A. 冒泡排序(Bubble sort) B. 謝耳排序(Shell sort) C. 插入排序(Insertion sort) D. 歸併排序(Merge sort)
7. 細閱下列程序段:
Pascal 版本
for i := 1 to 1000 do begin
if (i mod 3 = 0) or (i mod 5 = 0) or (i mod 7 = 0) then
write('*');
end;
C 版本
for (int i = 1; i <= 1000; ++i){
if (i%3 == 0 || i%5 == 0 || i%7 ==
0)
printf("*");
}
上述程序段會輸出多少個‘*’?
A. 483 B. 543 C. 623 D. 663
8. 細閱下列程序段:
Pascal 版本 a := 1;
repeat
a := a * b; { # } b := b - 1;
until b > 0;
C 版本 a = 1;
do{
a = a * b; /* # */
--b;
} while (b <= 0);
下列哪個/哪些敘述句必定正確?
(i) a 一直為正數。
(ii) 標記有 ‘#’ 的程序行運行恰好一次。
(iii) 標記有 ‘#’ 的程序行可能運行無限次。
A. 只有(i) B. 只有(ii) C. 只有(i) 和 (iii) D. 以上皆非
9. 設 random(n)傳回一個介乎 0 至 n-1 之間(包含 0 及 n-1)的隨機整數。下列哪個表達式傳回一個介乎-19 至 119(包含-19 及 119)的隨機整數?
A. random(70) - random(69) + 50 B. random(70) * (random(2) * 2 - 1) + 50 C. random(138) - 19
D. random(139) - 20
10. 設一程序使用約 1 秒以冒泡排序算法排序一隨機陣列A。若陣列長度增倍,同一程序需要多少時間將陣列 A 排序?
A. 約 1.5 秒 B. 約 2 秒 C. 約 4 秒 D. 約 8 秒
11. 若每個小孩可得到任何數目的書本,問有多少不同的方法可將五本不同的書本分予三個小孩?
A. 10 B. 60 C. 81 D. 243
12. 若布爾表達式(a + 1 - 1 > a) 的值為真,a 可為下列哪種類型的變量?
A. 字元變量 (Character variable) B. 整數變量 (Integer variable)
C. 浮點數變量 (Floating point variable)
D. 以上皆非
13. 設現有兩個容量分別為 5 升及 7 升的空水樽,並有下列三種操作:
(a) Fill X: 填滿水樽X。
(b) Pour X Y: 將X 的水倒往 Y,直至 X 為空或 Y 為滿。
(c) Empty X: 使X 為空。
問最少需要多少個操作,使得其中一個水樽有恰好四升的水?
A. 11 B. 12 C. 13 D. 6
14. 關係 「支配」滿足以下特性:
(a) 若A 支配 B 及 B 支配 C,則 A 支配 C。
(b) A 支配 B 及 B 支配 A 當且僅當 A = B。
(c) 對於所有 A 及 B,「A 支配 B」 及「 B 支配 A」至少其一為真。
設P 及 Q 為學生,且沒有任何兩個學生有相同的高度或重量。下列哪個/哪些為 「P 支配 Q」 的 合法定義?
(i) P 支配 Q 當且僅當 P 比 Q 高 (ii) P 支配 Q 當且僅當 P 不比 Q 高
(iii) P 支配 Q 當且僅當 P 不比 Q 矮,且不比 Q 重 (iv) P 支配 Q 當且僅當 P 比 Q 高,或比 Q 重
A. 只有(ii) B. 只有(iv) C. 只有(i)及(iii) D. 只有(ii)及(iii)
15. 設 1 = A[1] A[2] A[3] ... A[n] = n。
細閱下列程序段:
Pascal 版本 for i := 1 to n-1 do
for j := A[i] to A[i+1] do
write('*'); C 版本
for (int i=1; i<n; ++i)
for (int j=A[i]; j<=A[i+1]; ++j)
printf("*");
問一共輸出了多少”*”?
A. 2n-2 B. 2n-1 C. n(n-1)
D. 因為未知陣列A 的元素值,所以不確定
16. 給出敍述 P 及 Q:
P: 存在實數k 使得 (x1, y1) = (k * x2, k * y2)。
Q: (x1 * y2 = x2 * y1).
下列哪個/哪些敘述句必定正確?
(i) 若 P 為真,則 Q 必為真。
(ii) 若 Q 為真,則 P 必為真。
A. 只有 (i) B. 只有 (ii) C. (i) 及 (ii) D. 以上皆非
17. 下列哪個/哪些敘述句必定正確?
(i)
x x
(ii)
2 x x x 0 . 5
A. 只有 (i) B. 只有 (ii) C. (i) 和 (ii) D. 以上皆非
18. 若將 30 份獎品分配給 29 位學生,下列哪一/哪些敍述句必定正確?
(i) 最少一個學生得到恰好兩份獎品。
(ii) 每個學生得到最少一份獎品。
A. 只有 (i)- B. 只有 (ii) C. (i) 和 (ii) D. 以上皆非
19. 細閱以下的算符的真值表:
A B AB
F F T
F T T
T F F
T T T
下列哪個表達式與表達式U(V and U) 等價?
A. not V or U B. V and not U C. not V and U D. V or not U
20. 下列程序段的輸出為何?
Pascal 版本
writeln(12 mod -10);
C 版本
printf("%d\n", 12 % -10);
A. -2 B. 0 C. 2
D. 發生運行錯誤。
21. 問透過重新排列"HKOI2007"的字符可組成多少個不同的字串?
A. 40320 B. 5040 C. 20160 D. 12007
22. 下列哪個操作未能在一個整數陣列上進行?
A. 不檢查陣列的其他元素而找出第 k 個元素 B. 使用二分搜尋法而不改變陣列的任何一個元素 C. 移除一個元素
D. 互換兩個元素的值
23. 若要為下圖的每一個圓圈填上顏色,使得沒有相鄰的圓圈用上相同的顏色,問最少需要多少不同的顏色?
(兩個圓圈相鄰當且僅當它們是同一條線的端點。)
A. 2 B. 3 C. 4 D. 5
24. 四人想在晚上過橋,但他們只有一柄電筒,且每次只能有兩個人過橋。他們決定每次兩個人過橋,若仍有 人在另一邊,則由一個人把電筒帶回來。兩人的過橋時間為二人分別所需時間的較長者。假設四人的過橋
所需時間分別為1 、2、5 和 10 分鐘,問四人過橋最少需要多少時間?
A. 15 分鐘 B. 17 分鐘 C. 18 分鐘 D. 19 分鐘
25. 若要按個位數字的升序排序陣列(13, 18, 36, 42, 97),最少需要互換陣列的元素多少次?
A. 3 B. 4 C. 5 D. 6
26. 設a 為一個有 n 個數字的陣列,下列哪個/哪些程序段能找出陣列 a 中最大的元素?
Pascal 版本 (i)
max := a[n];
for i := n downto 1 do if a[i] > max then max := a[i];
(ii)
max := 0;
for i := 1 to n do if a[i] > max then max := a[i];
(iii)
max := a[1];
for i := 2 to n do if a[i] > max then max := a[i];
C 版本 (i)
max = a[n-1];
for (i = n-1; i >= 0; --i) if (a[i] > max)
max = a[i];
(ii)
max = 0;
for (i = 0; i < n; ++i) if (a[i] > max)
max = a[i];
(iii)
max = a[0];
for (i = 1; i < n; ++i) if (a[i] > max)
max = a[i];
A.只有 (i) 和 (ii) B. 只有(i) 和 (iii) C. 只有(ii) 和 (iii) D. (i)、(ii) 和 (iii)
27. 細閱下列程序段:
Pascal 版本 r := 0.7;
while r <> 109.2 do
r := 5 * r + 0.7; { # }
C 版本
r = 0.7;
while(r != 109.2)
r = 5*r + 0.7; /* # */
被‘#’標記的程序行一共運行了多少次?
A. 2 B. 3 C. 4
D. 因為無限循環而導致程序行運行無限次
28. 下列程序的輸出為何?
Pascal 版本 program SectA_Q28;
var
s : string;
i : integer;
begin
s := 'TGGGCTAACAAGCAAATGA';
while pos('A', s) > 0 do s[pos('A', s)] := 'U';
while pos('T', s) > 0 do s[pos('T', s)] := 'A';
while pos('G', s) > 0 do s[pos('G', s)] := 'C';
while pos('C', s) > 0 do s[pos('C', s)] := 'G';
writeln(s);
end.
C 版本
#include<stdio.h>
#include<string.h>
int main() {
char s[] = "TGGGCTAACAAGCAAATGA";
while (strchr(s, 'A') != NULL) s[strchr(s, 'A') - s] = 'U';
while (strchr(s, 'T') != NULL) s[strchr(s, 'T') - s] = 'A';
while (strchr(s, 'G') != NULL) s[strchr(s,'G') - s] = 'C';
while (strchr(s, 'C') != NULL) s[strchr(s, 'C') - s] = 'G';
printf("%s\n", s);
return 0;
}
A) ACCCGATTGTTCGTTTACT B) ACCCCAUUCUUCCUUUACU C) ACCCCATTCTTCCTTTACT D) AGGGGAUUGUUGGUUUAGU
29. 細閱下列程序段:
Pascal 版本
function f(x : integer) : integer;
var
t:integer;
begin t := 0;
while x <> 0 do begin
t := t*10 + x mod 10;
x := x div 10;
end;
f := t;
end;
C 版本
int f(int x) { int t = 0;
while (x) {
t = t*10 + x%10;
x /= 10;
}
return t;
}
若0 x < 10000,下列哪個/哪些語句必定正確?
(i) 若x 0,則 f(x) 0。
(ii) 若x y,則 f(x) f(y)。
A. 只有 (i) B. 只有 (ii) C. (i)及(ii) D. 以上皆非
30. 遍歷圖中每一條邊而不重覆的路徑稱為歐拉路徑。下列哪個/哪些圖包含(最少)一條歐拉路徑?
(i) (ii)
A. 只有 (i) B. 只有 (ii) C. (i) 和 (ii) D. 以上皆非
甲部完
乙部
下列各空格分別命名為A 至 J,請在答題紙上對應的地方填上答案:
(答題紙上每個小格只可填上一個字符,答案長度不得多於該題提供的小格數目。)
注意:
(1) 答案不可以包括 C 語言的 ?: 運算元。
(2) 除非適當的函數庫已被引用,否則答案不可以包括任何函數庫內的函數。
1. 「漢明數」(Hamming number)是指除了 2、3 及 5 之外,沒有其他質因數的正整數。例如:12 (=2x2x3) 是一 個漢明數,而14 (=2x7) 則不是。
下列函數檢查一整數n 是否漢明數,若 n 為漢明數則傳回1,否則傳回 0。請填充:
Pascal 版本
function hamming(n : integer) : integer;
var i : integer;
begin
if n = 1 then hamming := 1 else
begin i := 0;
if (n mod 2) = 0 then i := 2;
if (n mod 3) = 0 then i := 3;
if (n mod 5) = 0 then i := 5;
if i = 0 then A else
B ; end;
end;
C 版本
int hamming(int n){
int i;
if (n == 1) return 1;
i = 0;
if (n % 2 == 0) i = 2;
if (n % 3 == 0) i = 3;
if (n % 5 == 0) i = 5;
if (i == 0) A ; else
B ; }
2. 設A 為一個有 n 個整數的陣列,而 n 為 3 的倍數。
下列程序段賦值予陣列B,使得 B = (A[0], A[2], A[1], A[3], A[5], A[4], ... , A[n-3], A[n-1], A[n- 2])
。 請填充:
Pascal 版本
for i := 0 to n-1 do B[i] := A[ C ];
C 版本
for (i = 0; i < n; ++i B[i] = A[ C ];
3. 下列程式段找出最大的整數 k 使得 k 符合
2
km n !
而m 為整數。請填充。Pascal 版本 readln(n);
cnt := 0;
while (n > 0) do begin
D ; cnt := cnt + n;
end;
writeln(cnt);
C 版本
scanf("%d", &n);
cnt = 0;
while (n > 0){
D ; cnt = cnt + n;
}
printf("%d\n", cnt);
4. 下面的五邊形有 A, B, C, D 和 E 五點,每條邊的邊長顯示在邊旁。另外, AC =2、AD = 3、CE = 6、BD = 3 及 BE = 4。
(一個圖為連通圖當且僅當任意兩個節點間均有路徑相連。)
問最多能移除多少邊,而上列的圖仍為一個連通圖?
E .
若要移除一些邊,使得上列的圖仍為一個連通圖,且所移除的邊的總邊長為最大。問該最大總邊長為何?
F .
5. 下圖為一個國家的交通網路,每個圓圈代表一個城巿,每一線段代表兩個城巿之間的一道路,其長度如線 段旁所標示。
A. 一位遊客想從 s 走到 t。試找出一路徑使得他要走的距離為最短。
(在你的答案中,以 sp1p2...t 代表你的路徑, 而 p1, p2, ... 按次序為遊客路經的城巿。) G
B. 同一位遊客準備了另一路徑,以在A 部中的路徑被禁止通行時使用。他希望第二條路徑為第一條路徑(你 在A 部的回答)以外之所有路徑中最短。試找出一條符合此條件的路徑。
H
C. 另一位遊客希望他走的距離愈長愈好,但他不想重覆途徑同一個城巿。試找出一從s 到 t 的路徑,使得其 長度為最長,且不途徑任何城巿兩次或以上。
I
6. 下列程序以height 的遞降次序排序陣列 A,並以 weight 的遞降次序排序相同的 height 值的元素。
請填充:
Pascal 版本 program SectB_Q6;
type
man = record
height : integer;
weight : integer;
end;
const n = 100;
var
i, j : integer;
A : array[1..n] of man;
temp : man;
begin ...
for i:=1 to n do for j:=1 to n-i do if J then begin
temp := A[j];
A[j] := A[j+1];
A[j+1] := temp;
end;
...
end.
C 版本
#include <stdio.h>
struct man{
int height;
int weight;
};
int main() {
const int n = 100;
int i, j;
struct man A[n+1], temp;
...
for (i = 1; i <= n; ++i) for (j = 1; j <= n-i; ++j) if ( J ) {
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
} ...
return 0;
}
全卷完