宁波市历届中小学生计算机程序设计竞赛初赛试题
1、program nbxx09_1;
var a,b,s:longint; begin
readln(a); s:=a; b:=0;
while a<>0 do begin b:=b*10+a mod 10; a:=a div 10; end; s:=s+b; writeln(s); end.
输入:123456789 输出:
2、program nbXX09_2;
var u:array[0..3]of integer; a,b,c,x,y,z:integer; begin read(u[0],u[1],u[2],u[3]); a:=u[0]+u[1]+u[2]+u[3]-5; b:=u[0]*(u[1]-u[2]div u[3]+8); c:=u[0]*u[1] div u[2]*u[3]; x:=(a+b+2)*3-u[(c+3)mod 4]; y:=(c*100-13)div a div(u[b mod 3]*5); z:=(a+b+c-x-y)*2; if((x+y)mod 2=0)then z:=(a+b+c+x+y)div 2; writeln(x+y-z); end.
输入:2 5 7 4 输出:
3、program nbXX09_3;
var a,work:array[1..100] of integer; i,j,x,d,max:integer; begin
readln(max);
for i:=1 to max do begin read(a[i]); work[i]:=a[i]; end;
d:=max div 2;
while d>=1 do begin
for i:=d+1 to max do begin x:=work[i]; j:=i-d;
while (j>0) and (x 宁波市历届中小学生计算机程序设计竞赛初赛试题 work[j+d]:=x; end; d:=d div 2; end; for i:= max downto 1 do if a[i]=work[i] then write('1') else write('0'); writeln; end. 输入:8 71 88 149 32 66 90 144 99 4、program nbXX09_4; 输出: ______ var p:array[1..10000]of longint; n,i,x:longint; function find(x:longint):longint; begin if p[x]=x then find:=x else begin p[x]:=find(p[x]); find:=p[x]; end; end; begin readln(n,x); for i:=1 to n do read(p[i]); writeln(find(x)); for i:=1 to n-1 do write(p[i],' '); //两数之间输出一个空格 writeln(p[n]); end. 输入:5 5 3 3 3 2 4 输出: ______ _______________________ 四.程序填空(前5空,每空2分,后6空,每空3分,共28分) 1、“高效”排序 以下程序实现输入n个数,使用类似冒泡排序的方法,依次比较相邻的两个数,如果前一个数比后一个大,则交换两者,最终将输入的n个数从小到大排序后输出。程序在运行中发现某遍扫描后,没有数据交换发生,说明已经有序了,此时将退出扫描。请将程序补充完整。 program nbcz09_5; var n,i,j,tmp:longint; a:array[1..10000]of longint; flag:boolean; //flag=true表示有交换发生,flag=false表示没有交换 begin readln(n); 宁波市历届中小学生计算机程序设计竞赛初赛试题 for i:=1 to n do read(a[i]); i:=1; ①__________________; while flag and (i<=n-1) do begin flag:=false; for j:=1 to ②_____________ do if a[j]>a[j+1] then begin //前一个比后一个大 tmp:=a[j]; ③_________ __; a[j+1]:=tmp; ④______________; end; ⑤_______________; end; for i:=1 to n-1 do write(a[i],' '); writeln(a[n]); end. 2、数独游戏 在n行n列的方格中,每个格子填入一个1~n之间的数字,使得每行中没有重复数字,每列上也没有重复数字。如图1所示是一个3行3列的合法的安排方案。 1 2 3 2 3 1 3 1 2 图1 1 1 图 2 1 2 2 1 图3 1 2 图4 游戏开始可以规定某些格子已经有给定的数字。如图2所示,在2行2列的方格中,规定1行1列和2行2列 的数字均为1,则得到唯一的如图3所示的方案。但如果规定1行1列数字为1,2行2列数字为2,则无法得到任何合法的方案(如图4所示) 下面的程序求9行9列的一个安排方案,程序首先读入若干个已知格子上的数字,找到一个合理的安排方案后输出。如果没有任何合法方案,则输出“No Solution!”(注意引号不用输出)。 程序填充格子的次序依次为:1行1列、1行2列、…1行9列、2行1列、2行2列、…2行9列、…9行1列、9行2列、…9行9列。 请你将空白处的程序补充完整。 program nbxx09_6; var h:array[1..9,1..9]of boolean;//h[i,j]表示数字j是否出现在第i行 v:array[1..9,1..9]of boolean; //v[i,j]表示数字j是否出现在第i列 change:array[1..9,1..9]of boolean;//change[i,j]表示第i行第j列是否为规定的数字 a:array[1..9,1..9]of integer;//保存方案 i,j,k,n,x:integer; procedure print;//输出找到的方案 var i,j:integer; begin for i:=1 to 9 do begin for j:=1 to 8 do write(a[i,j],' '); 宁波市历届中小学生计算机程序设计竞赛初赛试题 writeln(⑥______________); end; end; procedure search(i,j:integer); //从i行j列开始填充 var k:integer; begin if (⑦__________________) then begin print; halt; //结束程序 end; if change[i,j] then begin for k:=1 to 9 do if (not h[i,k]) and(not v[j,k]) then begin h[i,k]:=true; v[j,k]:=true; ⑧________________; if j<9 then search(i,j+1) else search(⑨_________________); h[i,k]:=false; v[j,k]:=false; end end else begin if j<9 then search(i,j+1) else search(⑨_________________); end; end; begin for i:=1 to 9 do for j:=1 to 9 do begin h[i,j]:=false; //第i行没有数字j出现 v[i,j]:=false; //第i列没有数字j出现 a[i,j]:=0; //第i行第j列没有数字填入 change[i,j]:=true; //第i行第j列允许填充(没有给定的输入数字) end; readln(n); for k:=1 to n do begin readln(i,j,x); a[i,j]:=x; //第i行第j列给定的数字为x h[i,x]:=true; //第i行出现数字x v[j,x]:=true; //第j列出现数字x change[i,j]:=false; //第i行第j列不允许填充(已有给定的输入数字) end; search(⑩_______________); writeln(⑴___________); end. 宁波市历届中小学生计算机程序设计竞赛初赛试题 2009年宁波市第24届中小学计算机程序设计竞赛初赛答案 (小学组 Pascal 语言 时间:120分钟) 一、 单项选择题(每题1.5分,共30分) 题号 1 2 3 4 5 6 7 8 9 10 答案 题号 11 12 13 14 C 16 B 17 C 18 B 19 D 20 15 答案 C D A D C B D B C B 二、 问题求解(共2题,每题5分,共10分) 1、 abdfgec 2、①_7___ __ ② 15 (各2.5分) 三、 阅读程序(共4题,每题8分,共32分) 1、 1111111110 2、 263 3、 01000000 4、 3 (4分) 3 3 3 3 3 (4分) 5、 四、 完善程序(前5空,每空2分,后6空每空3分,共28分) ① flag:=true(大小写均可,下同) ② n-i (i后面有标点符号扣1分) ③ a[j]:=a[j+1] ④ flag:=true ⑤ i:=i+1 或inc(i) 或if not flag then i:=i+1 或if not flag then inc(i)