HKOI初赛高级组下列程序段中所有未有列出宣告Word下载.docx
《HKOI初赛高级组下列程序段中所有未有列出宣告Word下载.docx》由会员分享,可在线阅读,更多相关《HKOI初赛高级组下列程序段中所有未有列出宣告Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
a
=b;
b
=tmp;
end;
z[0]
=2;
z[1]
=3;
z[2]
=1;
z[3]
=4;
z[4]
=5;
fori:
=0to4do
forr
=1to4do
ifz[r-1]>
z[r]then
swap(z[r-1],z[r]);
write(z[i],'
'
);
end.
C版本
#include<
stdio.h>
voidswap(inta,intb){
inttmp;
tmp=a;
a=b;
b=tmp;
}
intmain(){
intz[5],i,r;
z[0]=2;
z[1]=3;
z[2]=1;
z[3]=4;
z[4]=5;
for(i=0;
i<
5;
++i)
for(r=1;
r<
++r)
if(z[r-1]>
z[r])
printf("
%d"
z[i]);
return0;
A.12345
B.43251
C.23145
D.54321
5.在棋盤上,如果兩隻后處於同一行、同一列或同一對角線上,則它們相互攻擊。
問下列哪個/哪些敍述必定正確?
(i)在N×
N的棋盤上可以且最多可以放置N隻后,使得沒有任何兩隻后相互攻擊。
在N×
(N+1)的棋盤上,可以且最多可以放置(N+1)隻后使得沒有任何兩隻后相互攻擊。
B.只有(ii)
C.(i)與(ii)
D.兩者皆否
6.細閱以下程序段:
Pascal版本
ifn<
mthen
t
=n;
n
=m;
m
=t;
i
while(n*imodm<
>
0)do
i
=i+1;
{*}
writeln(n*i);
if(n<
m){
t=n;
n=m;
m=t;
i=1;
while(n*i
%m
!
=0)
i++;
//*
printf("
%d\n"
n*i);
以下哪個/哪些敍述是正確的?
(i)標示為{*}(C版本為//*)的程序碼不會被執行當且僅當程序段運行前,n是m的倍數。
(ii)此程序段尋找m和n的最小公倍數。
(iii)i的最大值是m+1.
C.只有(i)和(ii)
D.只有(ii)和(iii)
7.細閱以下函數﹕
proceduref(n,m,num
vari
ifn<
0then
fori
=0tom-1do
f(n-1,m,num*10+i)
else
writeln(num);
voidf(intn,intm,intnum){
inti;
if(n
=m-1;
f(n-1,m,num*10+i);
num);
假設n和m皆為正數,和上述函數不會引致溢位問題。
以下哪一/哪些關於呼叫f(n,m,0)的敍述為真?
(i)上述函數在不引致運行錯誤下結束。
(ii)輸出有mn行。
(iii)每行輸出都是一個n位數字。
A.只有(iii)
B.只有(i)和(ii)
C.只有(i)和(iii)
8.在一幅地圖上,有些城巿與城巿之間以雙向道路相連。
在任何旅程中,我們從任一城巿甲出發,探訪一些其他的城巿,再回到城巿甲。
除城巿甲外,每個城巿都只可以被探訪最多一次,而且我們不可以重複通過同一道路。
我們發現現有的地圖上,有最少一個旅程,而且所有旅程都剛好通過奇數數目的道路。
下列哪個敍述必定正確?
A.我們無法將城巿分成兩組,使得任何以道路直接相連的城巿都屬於不同的組別
B.城巿的數目必為奇數。
C.城巿數目超過一的地圖沒可能符合條件
D.以上皆非
9.一條隊列可以有以下的運作﹕
進隊﹕在隊尾插入一個元素
出隊﹕刪除在隊頭的元素
已知隊列中有n個元素。
你需要刪除現在在隊尾的元素但要保持其他元素的排列次序。
問你最少需要多少次運作去能達到目的。
A.1
B.2n-2
C.2n-1
D.2n
細閱以下資料,然後解答題10至11。
下列地圖中,圓形及線段分別代表城鎮和道路。
有一位商人打算以最少時間從城鎮甲走到城鎮乙。
假設走完一條道路需時一天。
10.問商人需要多少時間從城鎮甲走到城鎮乙?
A.2天
B.3天
C.4天
D.5天
11.不幸地,地震發生了。
其中一個城鎮被破壞了。
另外尚有一條道路被破壞了,而其他的道路和城鎮都完好無缺。
商人無法通過被破壞的道路,或任何連接被破壞的城鎮的道路。
幸運地,我們知道城鎮甲和城鎮乙完好無缺,且連接城鎮甲或城鎮乙的道路均沒有被破壞。
假設商人知道哪條道路和哪個城鎮被破壞,問商人從城鎮甲走到城鎮乙最多需要多少天?
A.3
B.4
C.5
D.無法確定
12.細閱以下程序段﹕
forj
=0ton-1do
=0tom-2do
y[i]
=x[i+1];
y[m-1]
=x[0];
a:
=0;
b:
fori:
=0tom-1do
ify[i]<
x[(i+n)modm]then
a:
=1;
ify[i]=x[(m-n+i)modm]then
b:
for(j=0;
j<
n;
++j){
m-1;
y[i]=x[i+1];
y[m-1]=x[0];
a=0;
b=0;
for(i=0;
i<
m-1;
++i)
if(y[i]!
=x[(i+n)
%m])
a=1;
i++)
=x[(m-n+i)%m])
b=1;
假設y[0..m-1](C版本為y[m])和x[0..m-1](C版本為x[m])為數列。
n和m
為正整數且n小於m。
在以上的程序段運行後,以下那個敍述是對的?
A.a的值為0
B.b的值為0
C.y是由把x倒轉而得出的
D.y的每個元素均與x中同位置的元素相等
13.細閱下列程序段:
temp
=0;
fori
=0to9do
temp
=f(temp,A[i]);
writeln(temp);
temp=0;
for(i=0;
10;
++i)
temp=f(temp,A[i]);
temp);
設A[0..9]是一個正整數數列,且各元素均少於1000。
以下那個是敍述是錯的?
A.如果f(x,y)的傳回值是x+1,程序段的輸出就會是10
B.如果f(x,y)的傳回值是x和y的最大值,程序段的輸出就會是A數列中元素的最大值
C.如果f(x,y)的傳回值是x+y,程序段的輸出就會是A數列所有元素的總和
D.如果f(x,y)的傳回值是x*y,程序段的輸出就會是A數列所有元素的積
14.在假設溢位不會發生的情況下,以下哪個/哪些程序段可以將整數變量x和y的數值互換?
(i)
x
=2*x+2*y;
y
=2*y-x;
=x-y;
=ydiv2;
=xdiv2;
(ii)
=xdiv2+ydiv2;
=y-x;
=x*2;
=y*2;
x=2*x+2*y;
y=2*y-x;
x=x-y;
y=y/2;
x=x/2;
(ii)
x=x/2+y/2;
y=y-x;
x=x*2;
y=y*2;
A.只有(i)
B.只有(ii)
C.(i)和(ii)
15.細閱下列程序:
i:
longint;
whilei<
0do
begin
i
=i+2147483647;
end;
#include<
longi;
i=2;
while(i
i=i+2147483647;
對於以上程序,以下哪個/哪些是正確的?
(i)程序不會停止運行。
(ii)程序會有運行錯誤。
(iii)如果將用{*}(CVersion為//*)標示的那行改為"
i:
=i+2147483647;
"
(C版本為"
i=i+2147483647+1;
),程序仍會正常地結束。
A.只有(i)和(ii)
B.只有(ii)和(iii)
C.(i)、(ii)和(iii)
D.三者皆非
16.在一個3x3的棋盤上,假設一隻棋子可以任意跳到一個未到達過的格子,而每一跳所需的能量為目的地與起跳點的垂直距離加上水平距離。
假設可以在任何一格開始,問到達所有其他格子所需的能量最大值和最小值分別是?
最小值
最大值
A.
8
18
B.
24
C.
11
15
D.
16
17.現有17枝火柴砌成的一個2x3的板。
在只移除其中兩枝不在最外圍的火柴的條件下,有多少種方法使板變為只有四個不重疊的長方形?
A.12
B.13
C.14
D.15
18.細閱以下程序﹕
X,Y
readln(X,Y);
writeln((X-Y)mod6);
writeln(((Xmod6)-(Ymod6))mod6);
intX,Y;
intmain(){
scanf("
%d%d"
&
X,&
Y);
(X-Y)
%6);
((X
%6)-(Y
%6))
以下那組X和Y的值會使以上程序輸出兩個不同的整數?
X
Y
1
3
4
10
9
13
19.已知函數random()會回傳由0到99的整數,以及函數abs(x)會回傳x的絕對值。
問以下那一/那些句子會製造由0至9(包括0和9)的整數?
(i)random()div100*10(C版本為random()/100*10)
(ii)random()div2div5(C版本為random()/2/5)
(iii)abs(random()-50)div5(C版本為abs(random()-50)/5)
A.只有(ii)
B.只有(iii)
細閱以下程序,然後解答題20至21。
var
s
string;
i,j
='
110001'
;
j
=1to6do
ifs[i]='
0'
then
=(jshl1)or1;
1'
=jshr1;
writeln(j);
chars[]="
110001"
inti,j;
j=1;
6;
i++){
if(s[i]=='
)
j=(j<
<
1)|1;
if(s[i]=='
j>
}
j);
20.問上述程序段的輸出為何?
A.2
B.3
C.4
D.5
21.假設你能夠用其他字符串代替'
(C版本為"
)下列哪一/哪些是可能給出的輸出?
(i)7
(ii)9
(iii)16
(iv)31
B.只有(i)和(iii)
D.只有(ii)和(iv)
22.給出五個正整數,以下哪個/哪些敍述是正確?
(i)我們可以選擇最少一個數字使得它們的和為5的倍數。
(ii)我們可以選擇其中兩個正整數使得它們的和為奇數。
C.(i)和(ii)
23.設有N個學生。
若學生A和學生B是朋友,我們說A和B之間有一段友誼。
每段友誼只包括剛好兩個學生。
若兩段友誼所包括的兩對學生並不相同,這兩段友誼並不相等。
定義「能夠連絡」為﹕
1.若學生A和B是朋友,則A能夠連絡B,B亦能夠連絡A;
2.若學生A能夠連絡B,並且C是B的朋友,則A能夠連絡C,C亦能夠連絡A。
下列哪一/哪些敍述句正確?
A.最多可能的友誼數目為N2。
B.若最少有N-1段友誼,則每個學生都可以連絡其他學生。
C.若學生C並不能夠連絡學生A,則對於任何A能夠連絡的學生,C都不能夠連絡他們。
D.若所有學生都可以連絡其他學生,則一定存在最少N段友誼。
24.下列程序段的目的為何?
k
while(i<
n)and(i<
m)do
ifnmodi=mmodithen
k
=i;
writeln(k);
k=1;
i=2;
n&
&
%i==m
%i)
k=i;
k);
A.尋找n+m的因數中少於min(n,m)的最大整數
B.尋找能同時整除m和n的最大整數
C.尋找|n-m|的最大因數
D.尋找少於min(n,m)並不整除m和n的最大整數
細閱以下資料,然後解答題25至26。
“Wordbot”是一種能夠跟據指令而行走的機器人。
指令是由小寫英文字母組成的字串。
Wordbot最初在上圖的圓形1並開始行走。
當Wordbot接收指令時,它會逐一處理指令中的每個字元。
對於每一個字元,它會嘗試尋找在其位置的圓形上,帶有字元並向外的箭號,並跟據此箭號行走。
若沒有此箭號,Wordbot便會退回圓形1。
若Wordbot到達圓形5,它便會發出「嗶」聲,並自行關機。
例如,若指令是「ray」,Wordbot便會從圓形1走到圓形2,然後再走到圓形3,最後回到圓形1。
25.Wordbot會發出「嗶」聲當且僅當
A.“r”、“a”和“e”都出現在指令中
B.“rare”一字出現在指令中
C.指令以“rare”為開首
D.“rarer”一字出現在指令中
26.如果由圓形4至圓形3帶有字元“a”的箭頭被移除,下列哪一/哪些敘述正確?
(i)即使「rare」沒有在指令中出現,Wordbot亦可能發出「嗶」聲。
(ii)即使「rare」在指令中出現,Wordbot亦可能不會發出「嗶」。
D.兩者皆否
27.問以下程序的輸出為何?
i,j,k
=1to2009do
=k+imod2;
=k+imod4;
=k+imod6;
writeln(k);
inti,j,k;
k=0;
for(i=1;
i<
=2009;
++i){
k=k+i
%2;
k=k+i
%4;
%6;
return0;
A.2009
B.6027
C.9043
D.18086
28.在一個3列(row)、4行(column)的棋盤上,有多少方法可以放置6隻棋子,使得:
(i)沒有三隻棋子處於同一列,及
(ii)沒有三隻棋子處於同一行?
A.108
B.114
C.210
D.216
29.細閱以下程序﹕
g
functionF(x,y:
integer):
if(x=g)or(x=y)then
F
=1
f
=F(x-1,y-1)+F(x-1,y);
writeln(F(4,3));
writeln(F(4,2));
intg;
intF(intx,inty){
if(x==g||x==y)
return1;
else{
returnF(x-1,y-1)+F(x-1,y);
g=0;
F(4,3));
F(4,2));
以下那個/那些敍述必定正確?
(i)第一行的輸出為5。
(ii)所輸出的兩行是相等的。
(iii)如果標有{*}(C版本為//*)的那行改為g:
(C版本為g=1;
),以上程序所輸出的兩行是相等的。
30.細閱以下程序段﹕
=0to99do
x[i]:
j
x[0]
=y[0];
whil