小学生信息学奥赛决赛题0106年决赛题答案.docx
《小学生信息学奥赛决赛题0106年决赛题答案.docx》由会员分享,可在线阅读,更多相关《小学生信息学奥赛决赛题0106年决赛题答案.docx(22页珍藏版)》请在冰豆网上搜索。
小学生信息学奥赛决赛题0106年决赛题答案
2001年长沙市计算机奥林匹克竞赛决赛试题
(时间:
120分钟)
一、(40分)键入一个字符串(串长不超过20),输出相应字符组成的等边三角形。
如:
输入:
“CHINA”
输出:
程序:
programCS200101;
var
s:
string;
n,i,j:
integer;
begin
write('Inputastring:
');
readln(s);
n:
=length(s);
fori:
=1tondobegin
write('':
40-i);
forj:
=1toidowrite(s[j],'');
writeln
end;
readln
end.
二、(50分)一光滑墙壁高X尺,有一个小虫从墙底部向上爬,每分钟爬Y尺。
但每爬一分钟后都要休息一分钟,在休息期间又下滑一尺。
编程:
输入X和Y,计算该小虫最少几分钟可爬到顶端。
如:
输入:
X,Y=4,2
输出:
5
程序:
programCS200102;
varx,y,s,n:
integer;
begin
write('X,Y=');
readln(x,y);
ify>1thenbegin
s:
=0;n:
=0;
repeat
s:
=s+y;n:
=n+1;
ifs<>xthenbegin
s:
=s-1;n:
=n+1;
end;
untils>=x;
writeln(n);
endelsewriteln('Never');
readln
end.
三、(50分)科学家在热带森林中发现了一种特殊的小动物,取名为“吱吱”。
“吱吱”的生长繁殖过程很有规律,每对小“吱吱”经过X个月就长成一对大“吱吱”,每对大“吱吱”每个月都产下Y对小“吱吱”。
假设开始时有一对小“吱吱”,并且每对“吱吱”都不死,问:
过Z个月后,共有多少对“吱吱”?
(X≥1,Y≥1,1≤Z≤24)
(注:
若当前是1月,则“过”2个月,是表示到3月的时候)
输入:
X,Y,Z的值输出:
“吱吱”的总对数
如:
输入:
X,Y,Z=2,2,4
输出:
11
程序:
programCS200103;
var
x,y,z,s,s1,n:
longint;{s1为大“吱吱”的个数}
s2:
array[1..24]oflongint;{s2为小“吱吱”的个数,s2[1]代表第一天小“吱吱”的个数,依次类推}
begin
s:
=0;s1:
=0;s2[1]:
=1;
write('X,Y,Z=');
readln(x,y,z);
forn:
=xtoz+1dobegin
s2[n]:
=s1*y;{计算当天出生的小“吱吱”}
s1:
=s1+s2[n-x+1];s2[n-x+1]:
=0;{计算当天长大的“吱吱”,s2[n-x+1]为X个月前出生的小“吱吱”个数}
end;
s:
=s+s1;{将大“吱吱”数计入总数}
forn:
=1toz+1dos:
=s+s2[n];{将小“吱吱”数计入总数}
writeln(s);
readln
end.
四、(60分)如下图所示,键入A,B,C,D,E的值,然后从A出发,顺次经过每个数字分岔路口,选择+、-、*、/ 四种运算符之一进行运算,达到目的地E时,运算结果恰好等于E,请你将所有符合上述条件的道路全部找出来。
输入:
A、B、C、D和E的值(其中A、B、C、D都是1~9的数字,E是正整数)
输出:
从A能到达E的所有道路代表的运算式(注意:
前两步运算要加括号)
最后打印出道路的总数。
如:
输入:
A,B,C,D,E=1,2,3,4,10
输出:
((1+2)+3)+4=10
((1*2)*3)+4=10
TOTAL=2
程序:
programCS200104;
varA,B,C,D,E,sum,f1,f2,f3,total:
integer;
functions(n1,n2,f:
integer):
integer;
begin
casefof
1:
s:
=n1+n2;
2:
s:
=n1-n2;
3:
s:
=n1*n2;
4:
if(n2<>0)and(trunc(n1/n2)=n1divn2)thens:
=n1divn2elses:
=-1000;
end;
end;
procedurewf(x:
integer);
begin
casexof
1:
write('+');
2:
write('-');
3:
write('*');
4:
write('/');
end;
end;
begin
total:
=0;
write('A,B,C,D,E=');
readln(a,b,c,d,e);
forf1:
=1to4do
forf2:
=1to4do
forf3:
=1to4do
ife=s(s(s(a,b,f1),c,f2),d,f3)thenbegin
total:
=total+1;
write('(','(',a);wf(f1);
write(b,')');wf(f2);
write(c,')');wf(f3);
writeln(d,'=',e)
end;
writeln('TOTAL=',total);
readln;
end.
2002年长沙市计算机奥林匹克竞赛决赛试题
(时间:
120分钟)
一、填信息(20分)
小明对信息学很感兴趣,他报名参加今年的小学生电脑奥赛,报名时老师要求他填写自己的相关信息。
现在,请你将自己的相关信息打印出来。
显示格式要求如下:
说明:
X1为你的决赛证编号
X2为你的姓名(用拼音)
X3为你的性别(男生用boy,女生用girl)
X4为你所在的学校名称(用拼音)
MynumberisX1
MynameisX2
MysexisX3
MyschoolisX4
程序:
programCS200201;
begin
writeln('Mynumberis200201');
writeln('MynameisXiaoMing');
writeln('Mysexisboy');
writeln('MyschoolisTongPuJie');
end.
二、找字符(60分)
有一天,小明编了一个程序,能很快找出一个字符串中出现次数最多的字符,你能做到吗?
输入:
一个字符串(长度不超过50)
输出:
按字符在字符串中出现的先后顺序,显示出现次数最多的字符
样例
输入:
ACABBCCDDB
输出:
CB
程序:
programCS200202;
var
a,b:
string;
c:
char;
d:
array[1..50]ofinteger;{记录每一字符出现的次数,同时数组的序号也就代表了字符出现的先后次序}
i,j,max:
integer;
begin
readln(a);
b:
=a;{将字符串a赋值给b,起到保护输入的字符串a的作用。
这一操作不是必须的,也可以直接对字符串a进行操作。
但因后面的程序会造成对所操作的字符串内容的破坏,养成对输入内容进行保护的习惯有益的。
}
fori:
=1tolength(a)dobegin
c:
=b[i];
d[i]:
=0;
ifc<>'.'Then
forj:
=itolength(a)dobegin
ifc=b[j]thenbegin
d[i]:
=d[i]+1;b[j]:
='.';{每找到一个相同的字符就把此字符赋值为’.’,这样就不会重复寻找相同的字符,在d数组中每个字符出现次数的记录将是唯一的。
}
end;
end;
end;
max:
=d[1];
fori:
=2tolength(a)doifd[i]>maxthenmax:
=d[i];{寻找字符出现的最大次数}
fori:
=1tolength(a)doifd[i]=maxthenwrite(a[i]);{按次序输出出现资料最多的字符}
writeln;
readln;
end.
三、拼三角(60分)
有一次,老师给小明N根小木棒,要他从中选出K根,使这K根当中的任意三根都能拼成一个三角形。
老师告诉他,构成一个三角形的条件是:
任意两边之和大于第三边,任意两边之差小于第三边。
小明思考后,发现将这些小木棒按长短顺序排列后,很容易解决问题。
请你用表达式RANDOM(900)随机产生N个正整数(表示小木棒的长度),帮小明求出K的最大值。
输入:
N(3≤N≤500)
输出:
K的最大值
样例
输入:
6
排序后的6个随机数为:
19,26,161,220,348,529
输出:
3
程序:
programCS200203;{基本思路:
如果三角形中二条较小边的和大于最大边,则此三条边可以构成三角形。
对于有序排列的数,只要确定了能构成三角形的最小数和最大数,中间的每一个数都符合条件}
var
n,k,i,j,t,l:
integer;
a,b:
array[1..500]ofinteger;
ok:
boolean;
begin
readln(n);
fori:
=1tondobegin
a[i]:
=random(900)+1;
end;{生成随机数并赋值给数组a}
fori:
=1tondowrite(a[i]:
5);writeln;{显示生成的随机数,调试用}
fori:
=1ton-1do
forj:
=i+1tondo
ifa[i]>a[j]thenbegin
t:
=a[i];a[i]:
=a[j];a[j]:
=t;
end;{对生成的随机数从小到大进行排序}
fori:
=1tondowrite(a[i]:
5);writeln;{显示排序结果,调试用}
fori:
=1ton-2dobegin
ok:
=false;
l:
=n;
repeat
ifa[i]+a[i+1]>a[l]thenok:
=trueelsel:
=l-1;
untilokor(l=i+1);{对于每根小棒寻找能够构成三角形的最长小棒在数组a中的位置l}
ifokthenb[i]:
=l-i+1;{得到能与当前小棒组成三角形的小棒数量}
end;
fori:
=1tondowrite(b[i]:
5);writeln;
k:
=b[1];
forj:
=2tondo
ifb[j]>kthenk:
=b[j];
writeln('K=',k);
readln;
end.
四、数的统计(60分)
一个数“含有0”是指这个数至少有某一位数字为0。
小明对那些“含有0”的自然数很感兴趣,想挑出来进行研究。
那么,1~N当中“含有0”的自然数有多少个?
小明想在1秒钟内得到答案,你能帮他做到吗?
输入:
N(1≤N≤0)
样例
输入:
105
输出:
15
程序:
programCS200204;
varn,i,l:
longint;
s:
string;
begin
l:
=0;readln(n);
fori:
=1tondobegin
str(i,s);
ifpos('0',s)<>0thenl:
=l+1;
end;
writeln(l);
end.
2004年长沙市计算机奥林匹克竞赛决赛试题
(时间:
120分钟)
一、求和(30分)
由键盘输入正整数N(N≤100),求1到N之间所有的5的倍数之和S。
例:
输入:
N=10
输出:
S=15 (因为1~10之间只有5和10是5的倍数)
程序:
programCS200204;
varn,i,l:
longint;
s:
string;
begin
l:
=0;
readln(n);
fori:
=1tondobegin
str(i,s);
ifpos('0',s)<>0thenl:
=l+1;
end;
writeln(l);
end.
二、文本图形(50)
由键盘输入正整数N(N≤21)和一个字符串A(A由N个任意的大写字母组成),要求输出一个左右对称的N行的文本图形。
例:
输入:
N=4
A=ABCD
输出:
程序:
programCS200402;
var
n,i,j,k:
integer;
a:
string;
begin
write('N=');readln(n);
write('A=');readln(a);
fori:
=1tondobegin
write('':
41-i);
forj:
=1toidowrite(a[j]);
fork:
=i-1downto1dowrite(a[k]);
writeln;
end;readln;
end.
三、找数(60分)
由键盘输入正整数N(N≤500)和K(K≤9),请找一个正整数M,使N×M的值仅由0~K组成,而且0~K的每个数字至少出现一次。
编程序在1~30000范围内找出符合条件的最小的M值,如果找不到,则输出“Nofind!
”。
例:
①输入:
N,K=65,3
输出:
M=48 (因为65×48=3120)
②输入:
N,K=125,8
输出:
No find!
程序:
programCS200403;
varn,k,m,i,j,s:
longint;
t:
boolean;
a,b:
string;
label1;
begin
write('N,K=');readln(n,k);
form:
=1to30000dobegin
s:
=n*m;
t:
=true;
str(s,a);{将s转换为字符串a}
fori:
=0tokdobegin
str(i,b);
ifpos(b,a)=0thent:
=false;
end;{如果0~k之间有一个数不包含在a当中,则令逻辑指针为假}
forj:
=k+1to9dobegin
str(j,b);
ifpos(b,a)<>0thent:
=false;
end;{如果k~9之间有一个数包含在a当中,则令逻辑指针为假}
ift=truethengoto1;{找到符合条件的m值,跳转输出部分}
end;
1:
ift=truethenwriteln('M=',m)elsewriteln('Nofind!
');
readln;
end.
四、求倍数及“0”的个数(60分)
由键盘输入正整数N(N≤50),已知数列A1,A2,A3,……,An分别为2004,,2004,……,……2004。
问:
A1+A2+A3+……+An的精确值S有多少位数?
S当中有多少个“0”?
(设:
S的位数为K,S中“0”的个数为Z)
例:
输入:
N=2
输出:
K=8 Z=4 (因为S=)
程序:
programCS200404;
vara,s:
array[1..200]ofinteger;
n,k,z,i,j,m,l:
integer;
begin
write('N=');readln(n);
k:
=n*4;{得到S的位数。
}
fori:
=1tondobegin
forj:
=1to4*idobegin
l:
=jmod4;
caselof
0:
a[j]:
=2;
1:
a[j]:
=4;
2,3:
a[j]:
=0;
end;{生成An。
为方便运算,生成的An为4002……的形式,第一位为个数}
end;
form:
=1tokdobegin
s[m]:
=s[m]+a[m];
ifs[m]>=10thenbegin
s[m]:
=s[m]mod10;a[m+1]:
=a[m+1]+1;
end;{逢10进1}
end;{将An累加进s}
end;
z:
=0;
fori:
=1to4*ndoifs[i]=0thenz:
=z+1;{统计0的个数}
writeln('K=',k,'Z=':
5,z);
readln;
end.
2005年长沙市计算机奥林匹克竞赛决赛试题
(时间:
120分钟)
一、拆分整数:
(100分)
输入一个正整数N,如果N是偶数,则拆分N的各个数字相加求和;如果N是奇数,则拆分N的各个数字相乘求积。
输入输出样例:
输入:
N=126 输出:
H=9
输入:
N=123 输出:
J=6
程序:
programCS200501;
var
n,h,j,l,i,t:
integer;
a:
array[1..10]ofinteger;
s:
string;
begin
write('N=');readln(n);
t:
=n;i:
=1;
ift>10then
repeat
a[i]:
=tmod10;
t:
=tdiv10;
i:
=i+1;
untilt<10;
a[i]:
=t;{拆分N的各个数字,存放在数组a中}
str(n,s);{将数n转换为字符串s}
l:
=length(s);{取s长度,即得到数n的位数}
h:
=0;j:
=1;
ifnmod2=0thenbegin
fori:
=1toldoh:
=h+a[i];
writeln('H=',h);
endelsebegin
fori:
=1toldoj:
=j*a[i];
writeln('J=',j);
end;{根据N的奇偶求和或求积}
readln;
end.
二、排最大数:
(100分)
输入N个正整数,请你将它们连接在一起,排成一个最大的数。
例如:
N=4时,如果四个正整数是7、13、18、246,则连接成的最大数为72461813。
输入:
N(1≤N≤10) 输出:
连接成的最大数
N个正整数(以空格相隔)
输入输出样例:
输入:
N=4 输出:
72461813
7 13 18 246
程序:
programCS200502;
var
s:
array[1..10]ofstring;
a:
array[1..10]ofinteger;
n,i,j:
integer;
t:
string;
begin
write('N=');readln(n);
fori:
=1tondobegin
read(a[i]);
str(a[i],s[i]);
end;{输入数据并转换为字符串}
readln;
fori:
=1ton-1do
forj:
=itondo
ifs[i]
t:
=s[i];s[i]:
=s[j];s[j]:
=t;
end;{对字符串进行排序}
fori:
=1tondowrite(s[i]);{输出结果}
readln;
end.
三、扫雷游戏:
(100分)
有一种简单的扫雷游戏:
在N行2列的方格棋盘上,左列某些方格内埋有地雷,而右列每个方格中都有一个数字(0~3),第I格的数字表示:
左列第I-1、I、I+1格(即:
上、中、下三格)中埋雷的总数。
如下所示:
左图是初始状态,右图是扫雷完成状态(插小旗的方格内有雷)。
你的任务是:
根据右列的数字分析出左列格子中的地雷(0表示无雷,1表示有雷),并且统计出左列格子中地雷的总数。
输入:
N(2≤N≤40)
N个数字(以空格相隔),表示右列格子中的数字。
输出:
N个0、1数字(占一行),表示左列每格中有无地雷。
地雷总数(另起一行)
输入输出样例(如上图示):
输入:
N=7 输出:
0111011
1232222 L=5
程序:
programCS200503;
varn,l,i:
integer;
a,b:
array[1..40]ofinteger;
label1,2;
begin
write('N=');readln(n);
fori:
=1tondoread(b[i]);
readln;
ifn>2thenbegin
a[3]:
=b[2]-b[1];
a[1]:
=0;a[2]:
=b[1]-a[1];
fori:
=3tondobegin
a[i]:
=b[i-1]-a[i-1]-a[i-2];
if(a[i]<>0)and(a[i]<>1)thengoto1;
end;
ifa[n]<>b[n]-a[n-1]thengoto1;
goto2;
1:
a[1]:
=1;a[2]:
=b[1]-a[1];
fori:
=3tondobegin
a[i]:
=b[i-1]-a[i-1]-a[i-2];
end;
2:
l:
=0;
fori:
=1tondobegin
write(a[i]);
ifa[i]=1thenl:
=l+1;
end;
writeln;
writeln('L=',l);
end;
ifn=2then
caseb[1]of
0:
begin
writeln(0,0);writeln('L=',0);
end;
1:
begin
writeln(0,1);writeln(1,0);writeln('L=',1);
end;
2:
begin
writeln(1,1);writeln('L=',2);
end;
end;
readln;
end.
2006年长沙市计算机奥林匹克竞赛决赛试题
(时间:
120分钟)
一、评选(100分)
某班根据语文、数学、英语和计算机这四科成绩,评选学习积极分子。
评选规则如下:
(设:
Y、S、E、J分别代表语文、数学、英语、计算机)
1、四科平均成绩高于90分,可评为A类学习积极分子。
2、Y、S、E三科平均成绩高于80分,而且J不低于90分,可评为B类学习积极分子。
3、四科中最高分为100分,最低分不低于60分,可评为C类学习积极分子。
4、一个学生只能被评为符合条件的最高一类学习积极分子(A类最高、C类最低)。
现在输入某个学生的四科成绩,请判断该学生能被评为哪一类学习积极分子。
输入:
四个整数Y S E J
输出:
#A或#B或#C(分别表示A类、B类、C类学习积极分子)
若不符合任何评选条件,则输出“NO”。
样例:
输入:
Y,