复赛练习卷习题集Word格式文档下载.docx
《复赛练习卷习题集Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《复赛练习卷习题集Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
一行,一个整数n(1≤n≤400)
输出文件2.out:
一行7个整数,以空格相隔,(依次是星期一、星期二、星期三、……、星期日的次数)
样例
1
1312221
n,y,r,t,xq,i,j:
{n:
年,y:
月,r:
日期,t:
天数,xq:
星期几,i:
年数}
array[1..7]ofinteger;
assign(input,'
1.in'
);
reset(input);
assign(output,'
1.out'
rewrite(output);
readln(i);
i:
=1900+i;
{得到结束年份}
n:
=1900;
{开始于1900年}
xq:
repeat
fory:
=1to12do
begin
caseyof
1,3,5,7,8,10,12:
t:
=31;
4,6,9,11:
=30;
2:
if(nmod400=0)or(nmod100<
>
0)and(nmod4=0)
thent:
=29
elset:
=28
{判断每个月的天数}
forr:
=1totdo
=xq+1;
ifxq=8thenxq:
=1;
{星期从1到7变化,到8则令其为1}
ifr=13thens[xq]:
=s[xq]+1;
{日期为13时,对应的星期几次数增加1}
{每次循环时间过去一天}
{每次循环时间过去一个月}
=n+1;
{年份增加1}
untili=n;
forj:
=1to6dowrite(s[j],'
'
write(s[7];
close(input);
close(output);
第三题求位数及"
0"
的个数(3.pas)
输入一个正整数N(N≤50),已知数列A1,A2,A3,……,An分别为2008,20082008,200820082008,……,20082008……2008。
问:
A1+A2+A3+……+An的和S中共有多少位数?
S当中有多少个"
?
输入文件3.in:
只有一行,一个正整数N。
输出文件3.out:
只有一行,二个正整数,中间用空格隔开,表示和s的位数、s中0的个数。
样例:
2
83
var
a,s:
array[1..200]ofinteger;
n,k,z,i,j,m,l:
sx0803.in'
sx0803.out'
k:
=n*4;
{得到S的位数}
=1tondo{n个数}
=1to4*ido
L:
=jmod4;
caseLof
0:
a[j]:
=2;
1:
=8;
2,3:
{将第i个数按8002……80028002的形式存储,a[1]存放个位}
form:
=1tokdo{累加第i个数,按从低位到高位逐位相加}
s[m]:
=s[m]+a[m];
ifs[m]>
=10thenbegin
=s[m]mod10;
a[m+1]:
=a[m+1]+1;
z:
=1to4*ndo
ifs[i]=0thenz:
=z+1;
{统计0的个数}
writeln(k,'
z);
close(input);
第四题扫雷(4.pas)
有一种简单的扫雷游戏:
在n行2列的方格棋盘上,左列某些方格内埋有地雷,而右列每个方格中都有一个数字(0~3),第I格的数字表示:
左列第I-1、I、I+1格(即:
上、中、下三格)中埋雷的总数。
如下所示:
左图是初始状态,右图是扫雷完成状态(插小旗的方格内有雷)。
你的任务是:
根据右列的数字分析出左列格子中的地雷(0表示无雷,1表示有雷),并且统计出左列格子中地雷的总数。
输入文件
输入文件4.in:
第一行,一个整数N(3≤N≤40),第二行有N个数字(以空格相隔),表示右列格子中的数字。
输出文件
输出文件4.out:
第一行是N个0、1数字(没有空格相隔),表示左列每格中有无地雷。
第二行一个整数,表示地雷总数。
7
1232222
0111011
5
n,l,i:
a,b:
array[1..40]ofinteger;
flag1:
boolean;
sx0804.in'
);
sx0804.out'
=false;
=1tondoread(b[i]);
a[1]:
{初值}
a[2]:
=b[1]-a[1];
=3tondo
a[i]:
=b[i-1]-a[i-1]-a[i-2];
if(a[i]<
0)and(a[i]<
1)then
=true;
break;
ifa[n]<
b[n]-a[n-1]thenflag1:
ifflag1thenbegin
a[1]:
{初值}
a[2]:
fori:
=1tondo
write(a[i]);
ifa[i]=1thenL:
=L+1;
writeln;
writeln(L);
复赛练习二
第一题明明的随机数(1.pas)
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。
然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。
请你协助明明完成“去重”与“排序”的工作。
输入文件1.in有2行,第1行为1个正整数,表示所生成的随机数的个数N;
第2行有N个用空格隔开的正整数,为所产生的随机数。
输出文件1.out也是2行,第1行为1个正整数M,表示不相同的随机数的个数。
第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
输入:
10
2040326740208930040015
输出:
8
152032406789300400
a:
array[1..1000]ofboolean;
i,n,x,max:
longint;
sx0802.in'
sx0802.out'
fillchar(a,sizeof(a),false);
read(x);
a[x]:
=true;
=1to1000do
ifa[i]thenn:
writeln(n);
ifa[i]thenwrite(i,'
第二题喝醉的狱卒(2.pas)
在一所监狱里有一条长长的走廊,沿着走廊排列着n个牢房。
每个牢房有一个囚犯,而且房门都是锁着的。
一天晚上,狱卒觉得很无聊,于是他决定玩一个游戏。
第一轮,他喝了一口威士忌,然后沿着走廊,将所有牢房的门打开。
第二轮,他又喝了一口威士忌,然后又沿着走廊,将所有编号为2的倍数的牢房锁上。
第三轮,他再喝一口威士忌,再沿着走廊,视察所有编号为3的倍数的牢房。
如果牢房是锁着的,他就把它打开;
如果牢房是开着的,他就把他锁上。
他如此玩了n轮后,喝下最后一口威士忌,醉倒了。
当他醉倒后,一些犯人发现他们的牢房开着而且狱卒已经无能为力。
他们立刻逃跑了。
现给出走廊上牢房的数目,请你确认有多少犯人逃出了监狱。
输入文件2.in只有一行,为一个不大于10000的整数,表示牢房的数目n。
输出文件2.out只有一行,一个整数,表示逃跑的犯人的数目。
5
2
array[0..10001]ofboolean;
n,i,j,number:
sqrt.in'
sqrt.out'
read(n);
fillchar(a,sizeof(a),true);
=1tondivido
a[j*i]:
=not(a[j*i]);
number:
ifa[i]theninc(number);
writeln(number);
end.
第三题3n+1数链问题(文件名:
3.pas)
问题描述:
在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。
然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。
现在我们就有这样一个问题,问题如下:
(1)输入一个正整数n;
(2)把n显示出来;
(3)如果n=1则结束;
(4)如果n是奇数则n变为3×
n+1,否则n变为n/2;
(5)转入第
(2)步。
例如对于输入的正整数22,应该有如下数列被显示出来:
221134175226134020105168421
我们推测:
对于任意一个正整数,经过以上算法最终会推到1。
尽管这个算法很简单,但我们仍然无法确定我们的推断是否正确。
不过好在我们有计算机,我们验证了对于小于1000000的正整数都满足以上推断。
对于给定的正整数n,我们把显示出来的数的个数定义为n的链长,例如22的链长为16。
你的任务是编写一个程序,对于任意一对正整数i和j,给出i与j之间的最长链长,当然这个最长链长是由i与j之间的其中一个正整数产生的。
我们这里的i和j既包括i也包括j。
输入文件3.in只有一行,二个正整数i和j,i和j之间以一个空格隔开。
0<i≤j<1000。
输出文件3.out只有一行,一个正整数,即为i与j之间的最长链长。
(最长链长保证在150以内)
110
20
a,b,maxlen:
functionlinklen(x:
integer):
whilex<
1do
inc(L);
ifodd(x)thenx:
=x*3+1
elsex:
=xdiv2;
linklen:
=L;
end;
procedurerun;
i,L:
=atobdo
=linklen(i);
ifL>
maxlenthenmaxlen:
link.in'
link.out'
readln(a,b);
maxlen:
run;
writeln(maxlen);
第四题尼科梅彻斯定理(文件名:
4.pas)
任何一个正整数n的立方都可以写成一串连续的奇数之和,这就是著名的尼科梅彻斯定理。
例如:
13=1
23=3+5
33=7+9+11
43=13+15+17+19
现在当n给出之后,请你按从小到大的顺序输出这一串连续的奇数。
输入文件4.in只有一行,一个正整数n。
(n<
1000)
输出文件4.out只有一行,符合要求的一串连续的奇数,各数间只能用一空格隔开,行尾不能有多余的空格和回车。
4
13151719
n,i,k:
nico.in'
nico.out'
=n*(n-1)+1;
=1ton-1do
write(k,'
=k+2;
write(k);
复赛练习三
第一题除法(1.pas)
输入正整数N、M,求N÷
M的值。
如果商的小数部分出现循环节,则输出时要求用圆括号将循环节括起来,如果商为整数,则输出为整数。
例如:
1÷
2=0.5 1÷
3=0.(3)22÷
5=4.433÷
3=11
输入文件1.in:
一行,二个整数N,M,中间用空格间隔。
输出文件1.out:
一行,是N÷
M的值(保证小数点后不超过50位,而且未尾不能有多余的0)
4556
0.803(571428)
n,m:
real;
r,c:
array[0..50]ofreal;
i,j,k,flag:
integer;
readln(n,m);
flag:
ifn<
0thenbegin
c[0]:
=int(n/m);
r[0]:
=n-m*c[0];
while(r[k]<
0)and(flag=1)do
c[k+1]:
=int((r[k]*10)/m);
r[k+1]:
=r[k]*10-m*c[k+1];
=k+1;
ifk=50thenflag:
while(i<
k)and(flag=1)do
if(r[i]=r[k])thenflag:
=i+1;
ifr[0]<
0thenwrite(c[0]:
0:
0,'
.'
)
elsewrite(c[0]:
0);
=1toi-1dowrite(c[j]:
ifr[k]<
0thenwrite('
('
0then
=itokdowrite(c[j]:
0thenwriteln('
)'
)
elsewriteln;
elsewriteln('
b=0'
第二题找数(2.pas)
问题描述
输入正整数N(N≤500)和K(K≤9),请找一个正整数M,使N×
M的值仅由0~K组成,而且0~K的每个数字至少出现一次。
编程序在1~30000范围内找出符合条件的最小的M值,如果找不到,则输出“Nofind!
”。
输入文件2.in:
只有一行,2个整数N,K。
输出文件2.out,只有一行,输出M或Nofind!
。
653
48
n,k,m,i,j,s:
t:
string;
2.in'
reset(input);
2.out'
rewrite(output);
readln(n,k);
=1to30000do{枚举}
=n*m;
str(s,a);
{将s转换为字符串a}
=0tokdo
str(i,b);
ifpos(b,a)=0thent:
=false;
{如果0~k之间有一个数不包含在a当中,则令逻辑指针为假}
iftthen
=k+1to9do
str(j,b);
ifpos(b,a)<
0thent:
{如果k~9之间有一个数包含在a当中,则令逻辑指针为假}
iftthenbegin
writeln(m);
halt
writeln('
Nofind!
'
第三题文档编辑(3.pas)
暑假当中,妈妈让小慧帮忙修改英文资料,英文中还有一些统计数据(统计数据都是正整数,而且其前、后都有空格)。
妈妈说:
如果文档结尾处有“end”,则应当删除,文中所有的统计数据都要加上一个正整数m。
你能编程序完成小慧的任务吗?
二行,第一行是一个正整数m;
第二行是待修改的文档(字符串)。
一行,修改后的文档(字符串)
13
Thereare45studentsin32class.end
Thereare58studentsin32class.
st,st1:
i,k,m,sum:
ff:
readln(m);
readln(st);
st1:
=copy(st,length(st)-2,3);
ifst1='
end'
thendelete(st,length(st)-2,3)
elseff:
untilff;
whilei<
=length(st)do
if(st[i]<
='
9'
)and(st[i]>
0'
)and(st[i-1]='
thenbegin
=i;
sum:
while(st[k]>
)and(st[k]<
)and(k<
=length(st))do
begin
sum:
=sum*10+ord(st[k])-48;
k:
end;
ifst[k]='
write(m+sum);
=k-1;
end
elsewrite(st[i]);
end
end.
第四题取数游戏(4.pas)
给出2n(n<
=100)个自然数(数小于等于30000)。
游戏双方分别为A方(计算机方)和B方(对弈的人)。
只允许从数列两头取数。
A先取,然后双方依次轮流取数。
取完时,谁取得的数字总