• 沒有找到結果。

  x 表示不大於x 的最大整數;

N/A
N/A
Protected

Academic year: 2021

Share "  x 表示不大於x 的最大整數; "

Copied!
1
0
0

加載中.... (立即查看全文)

全文

(1)

下列程序段中,所有未有列出宣告 (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 ,直至迷宮 內再没有未填的空格。

(2)

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 版本

(3)

(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 版本

(4)

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)

(5)

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 版本

(6)

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);

(7)

下列哪個/哪些敘述句必定正確?

(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)

(8)

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

(9)

write('*'); C 版本

(10)

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 的元素值,所以不確定

(11)

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 AB

F F T

F T T

(12)

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 版本

(13)

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. 四人想在晚上過橋,但他們只有一柄電筒,且每次只能有兩個人過橋。他們決定每次兩個人過橋,若仍有 人在另一邊,則由一個人把電筒帶回來。兩人的過橋時間為二人分別所需時間的較長者。假設四人的過橋

(14)

所需時間分別為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];

(15)

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 版本

(16)

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';

(17)

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;

}

(18)

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 版本

(19)

int f(int x) { int t = 0;

while (x) {

t = t*10 + x%10;

x /= 10;

}

return t;

}

(20)

若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) 除非適當的函數庫已被引用,否則答案不可以包括任何函數庫內的函數。

(21)

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 版本

(22)

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 ; }

(23)

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 版本

(24)

for (i = 0; i < n; ++i B[i] = A[ C ];

3. 下列程式段找出最大的整數 k 使得 k 符合

2

k

m n !

m 為整數。請填充。

Pascal 版本 readln(n);

cnt := 0;

while (n > 0) do begin

D ; cnt := cnt + n;

end;

writeln(cnt);

C 版本

(25)

scanf("%d", &n);

cnt = 0;

while (n > 0){

D ; cnt = cnt + n;

}

printf("%d\n", cnt);

(26)

4. 下面的五邊形有 A, B, C, D 和 E 五點,每條邊的邊長顯示在邊旁。另外, AC =2、AD = 3、CE = 6、BD = 3 及 BE = 4。

(一個圖為連通圖當且僅當任意兩個節點間均有路徑相連。)

問最多能移除多少邊,而上列的圖仍為一個連通圖?

E .

若要移除一些邊,使得上列的圖仍為一個連通圖,且所移除的邊的總邊長為最大。問該最大總邊長為何?

F .

(27)

5. 下圖為一個國家的交通網路,每個圓圈代表一個城巿,每一線段代表兩個城巿之間的一道路,其長度如線 段旁所標示。

A. 一位遊客想從 s 走到 t。試找出一路徑使得他要走的距離為最短。

(在你的答案中,以 sp1p2...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;

(28)

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 版本

(29)

#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;

}

(30)

全卷完

參考文獻

相關文件

(Lebesgue Criterion): Dirichlet 函數 D(x) 不是 Riemann 可積。 Dirichlet 函數也精準 地說明 Riemann 積分的本質, 按照 Riemann 的定義 :

機器常數machine epsilon,以ϵmach表示,其值為1和比 1大的最小浮點數之間的距離。以下表格為IEEE 754浮點 數標準中各部份所佔的位元數: 精準度類型 符號部分 指數部分

這一節中我們想觀察函數的圖形在 x

對任意連續函數,每個小區間上的取樣點 x 都選擇在函數最 大值與最小值發生的點。如下圖,淺色方塊的高度都挑選小

[對數律 law of logarithm] 給定 x, y

對於給定的一個 x 值,經過某一對應方式後得到「唯一」的 y 值,這種對應方式我們稱 為函數,其中 x 是自變數,y 是應變數。. 而在表

[r]

整數數量乘以分數, 理解為將整數(例如: 9個) 數量按分母(例如: 3)均分, 並按分子(例如: 1) 取多少份,