师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第31页
a[1]:=d div 1000; a[2]:=(d mod 1000) div 100; a[3]:=(d mod 100) div 10; a[4]:=d mod 10; for i:=1 to 4 do for j:=i+1 to 4 do if a[i]
k:=a[i]; a[i]:=a[j]; a[j]:=k; end;
d:=1000*a[1]+100*a[2]+10*a[3]+a[4]-1000*a[4]-100*a[3]-10*a[2]-a[1];
writeln(1000*a[1]+100*a[2]+10*a[3]+a[4],'-',1000*a[4]+100*a[3]+10*a[2]+a[1],'=',d); end; end.
(以下程序设计试题来自《青少年信息学竞赛题库》)
(★)
1、 输入10个正整数,计算它们的和,平方和。
program I_1; var
i,s,d,p:integer; begin
writeln('input ten positive number:'); s:=0; p:=0; for i:=1 to 10 do begin
read(d);
s:=s+d; p:=p+d*d; end; writeln;
write(s:8,p:8); end.
2、 统计1——999中能被3整除,且至少有一位数字是5的数。
(答案:91)
(★)
program I_4; var
i,s:integer; begin
writeln; s:=0; for i:=1 to 999 do begin
if(i mod 3 = 0) and ((i mod 10 = 5) or ((i div 10) mod 10 =5) or ((i div 100)=5)) then begin write(i:8); s:=s+1; end; end;
writeln; write(s:8); end.
3、 从键盘输入一个20~50之间的整数,统计出边长为整数,周长为输入数的不等边三角形的个数。
(测试数据:输入27,
输出18)
(★★)
师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第32页
program I_9; var
x,y,z,k,s:integer; begin
writeln; writeln('input a integer number(20 for x:=1 to (s div 3) do for y:=x to ((s-x) div 2) do begin z:=s-x-y; if (x+y)>z then begin writeln(x:4,y:4,z:4); k:=k+1; end; end; if (s mod 3)=0 then k:=k-1; write(k); end. 4、 一个整数的立方可以表示为两个整数的平方差,如19853=19711052-19691202。 编程:输入一个整数N,自动将其写成N3=X2-Y2。 (★★★) (提示:N3=X2-Y2=(X+Y)(X-Y),所以必有(X-Y)=N,(X+Y)=N2。) (测试数据:N=2004; 答案20043=20090102-20070062) program I_13; var n,x,y:longint; begin writeln; read(n); for y:=1 to maxlongint do begin x:=y+n; if (n*n=x+y) then begin writeln(n,'^3=',x,'^2-',y,'^2'); exit; end; end; end. 5、 任意给定平面上三个点A(X1,Y1),B(X2,Y2),C(X3,Y3),试判断这三个点能否构成三 角形。能则求出它的面积。 ★) (测试数据: program I_16; var x1,y1,x2,y2,x3,y3,a,b,c,d,e,k:real; begin writeln; write('input X1,Y1 X2,Y2 X3,Y3:'); read(x1,y1,x2,y2,x3,y3); (★ 师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第33页 a:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); b:=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); c:=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); if a begin d:=(a+b+c)/2; e:=sqrt(d*(d-a)*(d-b)*(d-c)); write('area=',e:8:3); end else write('bu neng gou cheng san jiao xing'); end. 6、 59=32+52+52=12+32+72,即59可以分别等于两组不同的自然数(每组各3个数)的二次幂之和, 请找出10个最小的具有这种特性的数。 (分析:注意此程序中Goto语句的用法) (答案:(27、1、1、5、3、3、3)(33、1、4、4、2、2、5)(38、1、1、6、2、3、5)等) program e; label 1; var m,a,b,c,n,a1,b1,c1,count:integer; begin writeln; count:=0; m:=0; 1:repeat begin inc(m); if count>=10 then exit; n:=0; for a:=1 to trunc(sqrt(m/3)) do for b:=a to trunc(sqrt((m-a*a)/2)) do for c:=b to trunc(sqrt(m-a*a-b*b)) do if (a*a+b*b+c*c>m) then goto 1 else if (a*a+b*b+c*c=m) then begin inc(n); if n=1 then begin a1:=a; b1:=b; c1:=c; end else if n=2 then begin inc(count); writeln(m:4,a1:4,b1:4,c1:4,a:4,b:4,c:4); goto 1; end; end; end; until count>=10; end. 7、 每一个素数的倒数都可以化为一个循环小数,例如:1/7可以化为0.(142857),1/13可化为 0.(076923)。编程把17的倒数化为循环小数。 (答案:0.(0588235294117647)) (★★) (★★★) 师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第34页 program I_25; var a,b,c,i,j,k:integer; e:array[1..200] of integer; yes:boolean; begin writeln; a:=1; b:=17; for i:=1 to 200 do begin c:=a*10 div b; a:=10*a mod b; e[i]:=c; end; for i:=1 to 200 do for j:=i+1 to 200 do if (e[i]=e[j]) then begin yes:=true; for k:=1 to j-i do if e[i]<>e[j] then yes:=false; if yes=true then begin for k:=i to j-1 do write(e[k]); halt; end; end; end. 8、 求数列1、5、17、53、161、。。。前20项的和。(提示: An=2+3×An-1) ★) (答案:3486784380) program I_29; var an,am,s:real; i:integer; begin writeln; am:=1; s:=1; write(am:20:0); for i:=2 to 20 do begin an:=am*3+2; s:=s+an; am:=an; write(am:20:0); end; writeln; write('totle:',s:0:0); end. 9、 编一程序实现:由键盘输入年月日后,计算机能打印出该日期是星期几。 (★★) (★ (提示:首先算出这一年的元旦是星期几。算法如下:①输入年份year;②根据下面公式计算: d=year+((year-1)div 4)-((year-1)div 100)+((year-1)div 400) 师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第35页 d=d mod 7;那么d=0则表示为Sunday、d=1则表示为Monday、……依此类推。 ③输入月份month和日期day,计算该日期是这个年份中的第几天(x); ④计算(x+d-1)mod 7,得到星期几。 注意月份中的二月是28天还是29天,需看年份是否为闰年,闰年定义为:年份能被400整除的是闰年,或者年份能被4整除但不能被100整除的是闰年,其它年份均不为闰年。闰年的计算方法如下:若((year mod 4=0)and(year mod 100<>0))or(year mod 400=0)则为闰年。) program e; const yd:set of 1..12=[1,3,5,7,8,10,12]; {月大的月份} yx:set of 1..12=[4,6,9,11]; {月小的月份} a:array[1..12] of integer=(0,31,59,90,120,151,181,212,243,273,304,334); {a数组存放第i个月份的前i-1个月的天数} {因为这12个月的天数分别为31,28,31,30,31,30,31,31,30,31,30,31,故前i-1个月的天数为不断叠加} s:array[0..6] of string= ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'); var year,m,day,d,x:integer; r,flag:boolean; begin writeln('input year:'); readln(year); if (year mod 400=0)or((year mod 4=0)and(year mod 100<>0)) then r:=true else r:=false; repeat writeln('input month:'); readln(m); until (m in [1..12]); flag:=false; repeat writeln('input day:'); readln(day); if (m in yd)and(day in [1..31]) then flag:=true else if (m in yx)and(day in [1..30]) then flag:=true else if (m=2)and(r=true)and(day in [1..29]) then flag:=true else if (m=2)and(r=false)and(day in [1..28]) then flag:=true; until flag=true; d:=year+((year-1) div 4)-((year-1) div 100)+((year-1) div 400); {按公式计算d} d:=d mod 7; {得到元旦为星期几} x:=a[m]+day; {x表示该天是该年的第几天} if (m>2)and(r=true) then x:=x+1; {如果月份大于二月且该年为闰年,那么天数需要多加一天} x:=(x-1+d) mod 7; {x-1表示在元旦的基础上,该天是第多少天} writeln('Today is ',s[x]); end. 10、 ★★) 编程实现:键盘输入年月,计算机能打印出该月的月历,如输入2004、6,则输出: (★