程序设计答题分析12Word格式文档下载.doc
《程序设计答题分析12Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《程序设计答题分析12Word格式文档下载.doc(6页珍藏版)》请在冰豆网上搜索。
Fori:
=1tondo
Forj:
=1toido
S:
=s+(2*j-1);
Weite(s);
End.
3.李先生和他的孙子同出生于20世纪,他的孙子与他的年龄之差为60岁,李先生和他的孙子出生年份被3,4,5,6除,余数分别为1,2,3,4,编程求出李先生和他的孙子各出生在哪一年。
这个题用穷举法就太累了。
分析一下,一个数字被5除余3的话,这个数的个位数只能是3和8,被6除余4的话,个位数是4、8、2、6、0,这两者同时满足,这个年份的个位数只能是8。
只要从1908、1918、1928、1938,这四个数中找一个满足条件同时加60后也满足条件的就行了。
4.狼追兔子,兔子躲进了10个环形分布的洞的某一个中。
狼在第1个洞中没有找到兔子,就间隔1个洞,到第3个洞中去找,也没找到兔子,就间隔2个洞,到第6个洞中去找。
以后狼每次多隔1个洞去找兔子,……。
这样狼找了1000次也找不到兔子。
请问兔子可能躲在哪个洞中?
该题看似简单,只要每次把狼找过的洞删除就行了,但是,这种删除操作的结束状态(条件)是什么呢?
而且,狼的搜索过程中,如果要间隔11个洞时,我们是否可以认为就是间隔1个洞?
实际上,第一个问题应该是当狼回到第1个洞,并且又上间隔1个洞去找兔子时,就应该结束删除操作,因为此后的搜索是重复以前的搜索了,此时,那些没有被删除过的洞就是答案。
这里,大家一定不能想当然地认为:
结束条件就是只剩下一个洞的时候!
题目中并没有说明只有一个答案,事实上是有四个洞的!
第二个问题也是可行的。
因为只有10个洞,间隔11个洞和间隔1个洞的作用是相同的。
vard:
array[1..10]ofinteger;
i,j,k,l:
begin
fori:
=1to10dod[i]:
=1;
i:
j:
repeat
d[i]:
=0;
j:
=j+1;
ifj>
10thenj:
=j-10;
i:
=i+j;
ifi>
10theni:
=i-10;
until(i=1)and(j=1);
=1to10doifd[i]>
0thenwrite(i);
end.
初中
1.从键盘输入一个小于1000的正整数,若此数的各位数字之和能被7整除,则输出这个数。
此题简单,但重点在“被”字上,对输入的数分解出个、十、百位上的数字,相加后得出的和被7整除。
参考程序
programp1;
varn,m,k:
readln(k);
m:
whilen<
>
0do
=m+nmod10;
n:
=ndiv10;
end;
ifmmod7=0thenwriteln(k);
2.键盘输入N,求N!
末尾有多少个连续的零。
其中N!
=1×
2×
3×
……N(1<
=N<
=1000)。
算法一:
从1乘到n,每乘一个数判断一次,若后面有0则去掉后面的0,并记下0的个数。
为了不超出数的表示范围,去掉与生成0无关的数,只保留有效位数,当乘完n次后就得到0的个数。
(pascal程序如下)
vari,t,n,sum:
longint;
t:
sum:
readln(n);
fori:
begin
sum:
=sum*i;
whilesummod10=0do
begin
sum:
=sumdiv10;
inc(t);
{计数器增加1}
end;
=summod1000;
{舍去与生成0无关的数}
end;
writeln(t:
6);
算法二:
此题中生成O的个数只与含5的个数有关,n!
的分解数中含5的个数就等于末尾O的个数,因此问题转化为直接求n!
的分解数中含5的个数。
vart,n:
begin
readln(n);
repeat
n:
=ndiv5;
inc(t,n);
{计数器增加n}
untiln<
5;
分析对比两种算法就不难看出,它们的时间复杂度分别为O(N)、O(logN),算法二的执行时间远远小于算法一的执行时间。
在信息学奥赛中,其主要任务就是设计一个有效的算法,去求解所给出的问题。
如果仅仅学会一种程序设计语言,而没学过算法的选手在比赛中是不会取得好的成绩的,选手水平的高低在于能否设计出好的算法。
3.有1至8号共8个球,其中某一个为次品,仅重量不同(可轻可重)。
编程,在以天平为工具,通过测重量用最少的次数挑出次品,并确定它是轻是重。
提示:
可以用下面表示的比较方法来设计程序:
b1+b2+b3?
b4+b5+b6
=<
b1+b4?
b2+b5b7?
b8bl+b4?
b2+b5
>
<
>
b1?
b2b3?
b1b2?
b1b7?
b1b8?
blbl?
b2b1?
b3b2?
b1
==>
>
=>
=
是是是是是是是是是是是是是是是是
b1b5b6b3b2b4b7b8b7b8b2b4b3b6blb5
重轻轻重重轻重轻轻重轻重轻重轻重
参考考生程序
programp3;
varcpcode:
-8..8;
cpweight,zpweight,i:
wt:
array[1..8]ofinteger;
functionfinddiff(a,b,c:
integer):
ifa=bthen
ifa=cthenfinddiff:
=0
elseifa>
cthenfinddiff:
=-3elsefinddiff:
=3
else
ifa>
bthen
ifb=cthenfinddiff:
=1elsefinddiff:
=-2
=-1elsefinddiff:
=2;
write('
cipinhao:
'
);
readln(cpcode);
cipinzhong:
readln(cpweight);
zhengpinzhong:
readln(zpweight);
fori:
=1to8do
ifi=cpcodethenwt[i]:
=cpweightelsewt[i]:
=zpweight;
ifwt[1]+wt[2]+wt[3]<
wt[4]+wt[5]+wt[6]then
iffinddiff(wt[1],wt[2],wt[3])=0then
iffinddiff(wt[4],wt[5],wt[6])>
0thencpcode:
=3+finddiff(wt[4],wt[5],wt[6])
elsecpcode:
=-3-finddiff(wt[4],wt[5],wt[6])
=finddiff(wt[1],wt[2],wt[3]);
end
ifwt[7]>
wt[8]thenifwt[7]>
wt[1]thencpcode:
=7elsecpcode:
=-8
elseifwt[7]=wt[1]thencpcode:
=8elsecpcode:
=-7;
writeln(abs(cpcode));
Cipin:
'
ifcpcode<
0thenwriteln('
QING'
)elsewriteln('
ZHONG'
4.任意一个自然数,我们可以将其平均截取成三个自然数。
例如135768,可以截取成13,57,68。
如果某自然数不能平均截取(位数不能被3整除),可将该自然数高位补零后截取。
如4128,可在高位补零后成为004128,平均截取成00,41,28三个数。
编程从键盘上输入一个自然数N(N的位数<
12),计算截取后第一个数加第三个数减第二个数的结果。
此题难点数据类型上,限定小于12位的自然数已超出长整数的范围,可以转成字符串来运行。
programp4;
sting[12];
I,m,code,a:
Readln(n);
Caselength(n)mod3of
2:
n:
’0’+0;
1:
n:
=’00’+n;
End;
Val(copy(n,length(n)div3),m,code);
A:
=m;
Val(copy(nl