2001年长沙市计算机奥林匹克竞赛决赛试题
(时间:120分钟)
一、(40分)键入一个字符串(串长不超过20),输出相应字符组成的等边三角形。
如:输入:“CHINA”
输出:
程序:
program CS200101;
var
  s:string;
  n,i,j:integer;
begin
  write('Input a string:');
  readln(s);
  n:=length(s);
  for i:=1 to n do begin
    write('':40-i);
    for j:=1 to i do write(s[j],' ');
    writeln
  end;
  readln
end.
二、(50分)一光滑墙壁高X尺,有一个小虫从墙底部向上爬,每分钟爬Y尺。但每爬一分钟后都要休息一分钟,在休息期间又下滑一尺。编程:输入X和Y,计算该小虫最少几分钟可爬到顶端。
如:输入:X,Y=4,2
输出:5
程序:
program CS200102;
var x,y,s,n:integer;
begin
  write('X,Y=');
  readln(x,y);
  if y>1 then begin
    s:=0;n:=0;
    repeat
      s:=s+y;n:=n+1;
      if s<>x then begin
        s:=s-1;n:=n+1;
      end;
    until s>=x;
    writeln(n);
  end else writeln('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
程序:
program CS200103;
var
  x,y,z,s,s1,n:longint;{s1大“吱吱”的个数}
  s2:array[1..24] of longint;{s2为小“吱吱”的个数,s2[1]代表第一天小“吱吱”的个数,依次类推}
begin
  s:=0;s1:=0;s2[1]:=1;
  write('X,Y,Z=');
  readln(x,y,z);
  for n:=x to z+1 do begin
    s2[n]:=s1*y;{计算当天出生的小“吱吱”}
    s1:=s1+s2[n-x+1];s2[n-x+1]:=0;{计算当天长大的“吱吱”,s2[n-x+1]为X个月前出生的小“吱
吱”个数}
  end;
  s:=s+s1;{将大“吱吱”数计入总数}
  for n:=1 to z+1 do s:=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
程序:
program CS200104;
var A,B,C,D,E,sum,f1,f2,f3,total:integer;
function s(n1,n2,f:integer):integer;
  begin
    case f of
      1:s:=n1+n2;
      2:s:=n1-n2;
      3:s:=n1*n2;
      4:if (n2<>0) and (trunc(n1/n2)=n1 div n2) then s:=n1 div n2 else s:=-1000;
    end;
  end;
procedure wf(x:integer);
  begin
    case x of
      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);
    for f1:=1 to 4 do
        for f2:=1 to 4 do
          for f3:=1 to 4 do
              if e=s(s(s(a,b,f1),c,f2),d,f3) then begin
                  total:=total+1;
字符串长度为0和50之间                  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为你所在的学校名称(用拼音)
My number is X1
My name is X2
My sex is X3
My school is X4
程序:
program CS200201;
begin
writeln('My number is 200201');
writeln('My name is XiaoMing');
writeln('My sex is boy');
writeln('My school is TongPuJie');
end.
二、字符(60分)
有一天,小明编了一个程序,能很快出一个字符串中出现次数最多的字符,你能做到吗?
输入:一个字符串(长度不超过50)
输出:按字符在字符串中出现的先后顺序,显示出现次数最多的字符
样例
  输入:ACABBCCDDB
  输出:CB
程序:
program CS200202;
var
  a,b:string;
  c:char;
  d:array[1..50] of integer;{记录每一字符出现的次数,同时数组的序号也就代表了字符出现的先后次序}
  i,j,max:integer;
begin
readln(a);
b:=a;{将字符串a赋值给b,起到保护输入的字符串a的作用。这一操作不是必须的,也可以直接对字符串a进行操作。但因后面的程序会造成对所操作的字符串内容的破坏,养成对输入内容进行保护的习惯有益的。}
for i:=1 to length(a) do begin

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。