师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第36页
SUM MON TUE WED THU
6 13 20 27
7 14 21 28
1 8 15 22 29
2 9 16 23 30
3 10 17 24
FRI SAT 4 11 18 25
5 12 19 26
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); var
year,m,day,d,x,i:integer; r: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]);
if m in yd then day:=31
else if m in yx then day:=30
else if (m=2)and(r=true) then day:=29 else day:=28;
d:=year+((year-1) div 4)-((year-1) div 100)+((year-1) div 400); {按公式计算d} d:=d mod 7; {得到元旦为星期几}
x:=a[m]; {x表示该月是的前m-1个月的天数}
if (m>2)and(r=true) then x:=x+1; {如果月份大于二月且该年为闰年,那么天数需要多加一天} x:=(x-1+d) mod 7; {x-1表示在元旦的基础上,该天是第多少天,x表示上个月最后一天是星期几}
writeln('SUM':4,'MON':4,'TUE':4,'WED':4,'THU':4,'FRI':4,'SAT':4); for i:=0 to x do write('':4); {上个月占用的星期用空格输出} for i:=1 to day do begin
if (i+x) mod 7=0 then writeln; write(i:4); end; end. 11、
写出两个1,然后在它们中间插入2,成121;下一步是在上面数中每两个相邻的和数为
3的数之间插入3,成为13231;再下一步又在上面数中任意两个相邻的和数为4的数中插入4,成为1432341;由键盘输入N,求出用上面方式构造出来的序列,其最后插入的数是N。假设这
师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第37页
个序列不超过1000项,给出N=9时的运算结果。 12、
把所有3的方幂及不相等的3的方幂的和排列成递增序列:1、3、4、9、10、12、13、。。。
这个序列的第300项是多少?(6840) 13、
两个1,两个2,两个3,这6个数可组成6位数312132。这个数有如下特点:两个1
之间隔一位,两个2之间隔两位,两个3之间隔3位。231213也是一个符合条件的6位数。用数字1、2、3、4、5、6、7、8各两个,可以组成类似的16位数,请找出10个这样的16位数。 14、
对于所有的数字不完全相同的三位数(不够三位数的前面补零也当成是三位数)。我们定
出如下计算规则:用这个三位数的三个数字可组成的最大数减去可组成的最小数,则得到一个新的三位数;对新的三位数还按照上面的规则继续算下去,最后会发现,我们陷入一个死循环里,或者说是跌入了一个数的黑洞里。用具体例子说明。比如从三位数123开始,计算如下321-123=198;981-189=792;972-279=693;963-369=594;954-459=495;954-459=495;…. 从其他的任何三位数开始,最终也都会停止在495,我们把495叫做三位数的黑洞。类似地也存在着一个由一个数组成的四位数的黑洞。请编程序把它找出来。(6174) (答案:与前面的数学黑洞问题相似,故此程序略) 15、
11,323,74947,63144136这样的数叫回文数,它们的特点是最高位、最低位的数相
同,次高位,次低位相同,….其中11是个更特殊的回文数,它的平方121、立方1331也是回文数。这是最小的一个具有这种性质的回文数。请编程,找出三次方小于999999999的具有上述性质的所有回文数。
(答案:1、2、11、101、111) program e;
var
i:longint;
function huiwen(x:longint):boolean; var
a,b:array[1..100] of integer; m,n,y:longint;
(★★)
师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第38页
hw:boolean; begin
if x<1 then begin huiwen:=false; exit; end; for m:=1 to 100 do a[m]:=0; y:=x; m:=0; repeat
inc(m); a[m]:=y mod 10; y:=y div 10; until y=0;
for n:=1 to m do b[n]:=a[m+1-n]; n:=1;
while (n<=m)and(a[n]=b[n]) do inc(n);
if n=m+1 then huiwen:=true else huiwen:=false; end;
{=============main=============} begin writeln;
for i:=1 to 999 do
if (huiwen(i)=true)and(huiwen(i*i)=true)and(huiwen(i*i*i)=true) then write(i:8); end. 16、
请编写程序,以简单算术表达式作为输入,构造对应的无括号表达式(无括号表达式的运
算符写在运算对象的后面)。如:输入:A*(B-C)+D,应输出ABC-*D+;输入:(A+B)/C-D*E,应输出AB+C/DE*-。 17、
键盘输入一个只含加、减、乘、除四则运算和括号的数学表达式,编程求出该表达式的值
并输出结果。 18、
一只公鸡值5元,一只母鸡值3元,3只小鸡值1元,现用一百元要买一百只鸡,问有什
么方案?
(答案:(0、25、75),(4、18、78),(8、11、81),(12、4、84)) program e; var
i,j,k:integer; begin writeln;
for i:=1 to 20 do for j:=1 to 33 do begin
k:=100-i-j;
if (k mod 3=0)and(5*i+3*j+(k div 3)=100) then writeln(i:8,j:8,k:8); end; end.
(★★)
师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第39页
(来自其它试题)
1、 某超市为了促销,规定:购物不足50元的按原价付款,超过50不足100的超过部分按九折付款,
超过100元的,超过部分按八折付款。编一程序完成超市的自动计费的工作。
program e; var
n,money:real; begin
writeln; writeln('input the money number:'); readln(n); money:=0; if n<=50 then money:=n
else if (n>50)and(n<=100) then money:=50+(n-50)*0.9 else money:=50+(100-50)*0.9+(n-100)*0.8; writeln('money=',money:0:2); end.
2、 输入四个整数,排出名次后输出这四个数。如输入75、99、67、98。则输出:
75——3、99——1、67——4、98——2。
相关练习:任意输入N个整数,排出名次后输出这N个数。 program e; var
a:array[1..4] of integer; i,j,m:integer; begin writeln;
for i:=1 to 4 do read(a[i]); for i:=1 to 4 do begin
m:=1; write(a[i],'--'); for j:=1 to 4 do
if a[j]>a[i] then inc(m); write(m,' '); end; end.
3、 任意输入一个正整数( (测试数据:35829083; 答案:38) program e; var n,s:longint; begin writeln; writeln('input n:'); readln(n); s:=0; while n>0 do begin s:=s+(n mod 10); n:=n div 10; end; writeln(s); end. (★) (★★★) (★) 师大附中 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第40页 4、 1981年,李氏兄弟三人核对自己的年龄。老三说,第一,我们三兄弟之间年龄之差是相等的;第 二,去年我们三兄弟的年龄数恰好都等于各自出生年份中各数之和的2倍。你能根据这两点提示,编程计算出这兄弟三人的年龄和出生年月吗? (分析:假定这三兄弟均在1900年后出生) (答案:1981年时,老大43岁1938年出生、老二37岁1944年出生、老三31岁1950年出生) program e; var a,b,c:integer; begin writeln; for a:=1 to 100 do for b:=a+1 to 100 do for c:=b+1 to 100 do if (c-b=b-a) then if((a-1)=2*(10+((1981-a)mod 10)+(((1981-a)div 10)mod 10))) then if ((b-1)=2*(10+((1981-b)mod 10)+(((1981-b)div 10)mod 10))) then if ((c-1)=2*(10+((1981-c)mod 10)+(((1981-c)div 10)mod 10))) then writeln(a:4,b:4,c:4); end. 5、 将1~9这9个数字分成三组,每组3个数字,每个数字只能且必须使用一次,并且每组中的3个 数字组成的三位数又要是完全平方数。请编程找出这样的数。 (★★) (★★) (分析:注意下面程序所采取的方法与前面类似问题的算法一样,非常好。答案:361、529、784) program e; var i,j,k,g,s,b,t,n:integer; a:array[0..9] of integer; begin writeln; for i:=11 to 31 do for j:=i to 31 do for k:=j to 31 do begin for n:=0 to 9 do a[n]:=0; g:=i*i mod 10; s:=(i*i div 10) mod 10; b:=i*i div 100; a[g]:=1; a[s]:=1; a[b]:=1; g:=j*j mod 10; s:=(j*j div 10) mod 10; b:=j*j div 100; a[g]:=1; a[s]:=1; a[b]:=1; g:=k*k mod 10; s:=(k*k div 10) mod 10; b:=k*k div 100; a[g]:=1; a[s]:=1; a[b]:=1; t:=0; for n:=1 to 9 do t:=t+a[n]; if t=9 then writeln(i*i:8,j*j:8,k*k:8); end; end.