复赛练习卷习题集.docx
- 文档编号:8197447
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:31
- 大小:30.01KB
复赛练习卷习题集.docx
《复赛练习卷习题集.docx》由会员分享,可在线阅读,更多相关《复赛练习卷习题集.docx(31页珍藏版)》请在冰豆网上搜索。
复赛练习卷习题集
复赛练习一
第一题判奇偶求和(1.pas)
问题描述:
输入一个正整数n,如果n是奇数,则求1~n之间所有的偶数之和;如果n是偶数,则求n所有的约数之和(包括1和本身)。
输入文件:
输入文件1.in只有1行,一个正整数n(在标准整型范围)。
输出文件:
输出文件1.out也只有一行,一个和值(测试数据会保证这个值在标准整型范围)。
样例1:
输入:
11
输出:
30
样例2:
输入:
12
输出:
28
var
n,i,s:
integer;
begin
assign(input,'sx0801.in');
assign(output,'sx0801.out');
reset(input);
rewrite(output);
readln(n);
ifodd(n)thenbegin
s:
=0;
fori:
=2tondo
ifnotodd(i)thens:
=s+i;{求偶数之和}
end
elsebegin
s:
=0;
fori:
=1tondo
ifnmodi=0thens:
=s+i;{求约数之和}
end;
writeln(s);
close(input);
close(output);
end.
第二题13号星期几(2.pas)
编程统计:
从1900年1月1日(星期一)开始经过的n年当中,每个月的13号这一天是星期一、星期二、星期三、……、星期日的次数分别是多少?
输入文件2.in:
一行,一个整数n(1≤n≤400)
输出文件2.out:
一行7个整数,以空格相隔,(依次是星期一、星期二、星期三、……、星期日的次数)
样例
输入:
1
输出:
1312221
var
n,y,r,t,xq,i,j:
integer;{n:
年,y:
月,r:
日期,t:
天数,xq:
星期几,i:
年数}
s:
array[1..7]ofinteger;
begin
assign(input,'1.in');
reset(input);
assign(output,'1.out');
rewrite(output);
readln(i);
i:
=1900+i;{得到结束年份}
n:
=1900;{开始于1900年}
xq:
=0;
repeat
fory:
=1to12do
begin
caseyof
1,3,5,7,8,10,12:
t:
=31;
4,6,9,11:
t:
=30;
2:
if(nmod400=0)or(nmod100<>0)and(nmod4=0)
thent:
=29
elset:
=28
end;{判断每个月的天数}
forr:
=1totdo
begin
xq:
=xq+1;ifxq=8thenxq:
=1;{星期从1到7变化,到8则令其为1}
ifr=13thens[xq]:
=s[xq]+1;{日期为13时,对应的星期几次数增加1}
end;{每次循环时间过去一天}
end;{每次循环时间过去一个月}
n:
=n+1;{年份增加1}
untili=n;
forj:
=1to6dowrite(s[j],'');write(s[7];
close(input);
close(output);
end.
第三题求位数及"0"的个数(3.pas)
问题描述:
输入一个正整数N(N≤50),已知数列A1,A2,A3,……,An分别为2008,20082008,200820082008,……,20082008……2008。
问:
A1+A2+A3+……+An的和S中共有多少位数?
S当中有多少个"0"?
输入文件:
输入文件3.in:
只有一行,一个正整数N。
输出文件:
输出文件3.out:
只有一行,二个正整数,中间用空格隔开,表示和s的位数、s中0的个数。
样例:
输入:
2
输出:
83
var
a,s:
array[1..200]ofinteger;
n,k,z,i,j,m,l:
integer;
begin
assign(input,'sx0803.in');
reset(input);
assign(output,'sx0803.out');
rewrite(output);
readln(n);
k:
=n*4;{得到S的位数}
fori:
=1tondo{n个数}
begin
forj:
=1to4*ido
begin
L:
=jmod4;
caseLof
0:
a[j]:
=2;
1:
a[j]:
=8;
2,3:
a[j]:
=0;
end;{将第i个数按8002……80028002的形式存储,a[1]存放个位}
end;
form:
=1tokdo{累加第i个数,按从低位到高位逐位相加}
begin
s[m]:
=s[m]+a[m];
ifs[m]>=10thenbegin
s[m]:
=s[m]mod10;
a[m+1]:
=a[m+1]+1;
end;
end;
end;
z:
=0;
fori:
=1to4*ndo
ifs[i]=0thenz:
=z+1;{统计0的个数}
writeln(k,'',z);
close(input);
close(output);
end.
第四题扫雷(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
var
n,l,i:
integer;
a,b:
array[1..40]ofinteger;
flag1:
boolean;
begin
assign(input,'sx0804.in');
reset(input);
assign(output,'sx0804.out');
rewrite(output);
flag1:
=false;
readln(n);
fori:
=1tondoread(b[i]);
a[1]:
=0;{初值}
a[2]:
=b[1]-a[1];
fori:
=3tondo
begin
a[i]:
=b[i-1]-a[i-1]-a[i-2];
if(a[i]<>0)and(a[i]<>1)then
begin
flag1:
=true;
break;
end;
end;
ifa[n]<>b[n]-a[n-1]thenflag1:
=true;
ifflag1thenbegin
a[1]:
=1;{初值}
a[2]:
=b[1]-a[1];
fori:
=3tondo
begin
a[i]:
=b[i-1]-a[i-1]-a[i-2];
end;
end;
L:
=0;
fori:
=1tondo
begin
write(a[i]);
ifa[i]=1thenL:
=L+1;
end;
writeln;
writeln(L);
close(input);
close(output);
end.
复赛练习二
第一题明明的随机数(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
var
a:
array[1..1000]ofboolean;
i,n,x,max:
longint;
begin
assign(input,'sx0802.in');
assign(output,'sx0802.out');
reset(input);
rewrite(output);
readln(n);
fillchar(a,sizeof(a),false);
fori:
=1tondo
begin
read(x);
a[x]:
=true;
end;
n:
=0;
fori:
=1to1000do
ifa[i]thenn:
=n+1;
writeln(n);
fori:
=1to1000do
ifa[i]thenwrite(i,'');
close(input);
close(output);
end.
第二题喝醉的狱卒(2.pas)
问题描述:
在一所监狱里有一条长长的走廊,沿着走廊排列着n个牢房。
每个牢房有一个囚犯,而且房门都是锁着的。
一天晚上,狱卒觉得很无聊,于是他决定玩一个游戏。
第一轮,他喝了一口威士忌,然后沿着走廊,将所有牢房的门打开。
第二轮,他又喝了一口威士忌,然后又沿着走廊,将所有编号为2的倍数的牢房锁上。
第三轮,他再喝一口威士忌,再沿着走廊,视察所有编号为3的倍数的牢房。
如果牢房是锁着的,他就把它打开;如果牢房是开着的,他就把他锁上。
他如此玩了n轮后,喝下最后一口威士忌,醉倒了。
当他醉倒后,一些犯人发现他们的牢房开着而且狱卒已经无能为力。
他们立刻逃跑了。
现给出走廊上牢房的数目,请你确认有多少犯人逃出了监狱。
输入文件:
输入文件2.in只有一行,为一个不大于10000的整数,表示牢房的数目n。
输出文件:
输出文件2.out只有一行,一个整数,表示逃跑的犯人的数目。
样例:
输入:
5
输出:
2
var
a:
array[0..10001]ofboolean;
n,i,j,number:
longint;
begin
assign(input,'sqrt.in');
reset(input);
assign(output,'sqrt.out');
rewrite(output);
read(n);
fillchar(a,sizeof(a),true);
fori:
=2tondo
begin
forj:
=1tondivido
a[j*i]:
=not(a[j*i]);
end;
number:
=0;
fori:
=1tondo
ifa[i]theninc(number);
writeln(number);
close(input);
close(output);
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
var
a,b,maxlen:
integer;
functionlinklen(x:
integer):
integer;
var
L:
integer;
begin
L:
=1;
whilex<>1do
begin
inc(L);
ifodd(x)thenx:
=x*3+1
elsex:
=xdiv2;
end;
linklen:
=L;
end;
procedurerun;
var
i,L:
integer;
begin
fori:
=atobdo
begin
L:
=linklen(i);
ifL>maxlenthenmaxlen:
=L;
end;
end;
begin
assign(input,'link.in');
assign(output,'link.out');
reset(input);
rewrite(output);
readln(a,b);
maxlen:
=0;
run;
writeln(maxlen);
close(input);
close(output);
end.
第四题尼科梅彻斯定理(文件名:
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
var
n,i,k:
longint;
begin
assign(input,'nico.in');
reset(input);
assign(output,'nico.out');
rewrite(output);
readln(n);
k:
=n*(n-1)+1;
fori:
=1ton-1do
begin
write(k,'');
k:
=k+2;
end;
write(k);
close(input);
close(output);
end.
复赛练习三
第一题除法(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)
var
n,m:
real;
r,c:
array[0..50]ofreal;
i,j,k,flag:
integer;
begin
assign(input,'1.in');
reset(input);
assign(output,'1.out');
rewrite(output);
readln(n,m);
k:
=0;
flag:
=1;
ifn<>0thenbegin
c[0]:
=int(n/m);
r[0]:
=n-m*c[0];
while(r[k]<>0)and(flag=1)do
begin
c[k+1]:
=int((r[k]*10)/m);
r[k+1]:
=r[k]*10-m*c[k+1];
k:
=k+1;
i:
=0;
ifk=50thenflag:
=0;
while(i begin if(r[i]=r[k])thenflag: =0; i: =i+1; end; end; ifr[0]<>0thenwrite(c[0]: 0: 0,'.') elsewrite(c[0]: 0: 0); forj: =1toi-1dowrite(c[j]: 0: 0); ifr[k]<>0thenwrite('('); ifr[0]<>0then forj: =itokdowrite(c[j]: 0: 0); ifr[k]<>0thenwriteln(')') elsewriteln; writeln; end elsewriteln('b=0'); close(input); close(output); end. 第二题找数(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 var n,k,m,i,j,s: longint; t: boolean; a,b: string; begin assign(input,'2.in');reset(input); assign(output,'2.out');rewrite(output); readln(n,k); form: =1to30000do{枚举} begin s: =n*m; t: =true; str(s,a);{将s转换为字符串a} fori: =0tokdo begin str(i,b); ifpos(b,a)=0thent: =false; end;{如果0~k之间有一个数不包含在a当中,则令逻辑指针为假} iftthen forj: =k+1to9do begin str(j,b); ifpos(b,a)<>0thent: =false; end;{如果k~9之间有一个数包含在a当中,则令逻辑指针为假} iftthenbegin writeln(m);close(output);halt end; end; writeln('Nofind! '); close(input); close(output); end. 第三题文档编辑(3.pas) 问题描述: 暑假当中,妈妈让小慧帮忙修改英文资料,英文中还有一些统计数据(统计数据都是正整数,而且其前、后都有空格)。 妈妈说: 如果文档结尾处有“end”,则应当删除,文中所有的统计数据都要加上一个正整数m。 你能编程序完成小慧的任务吗? 输入文件3.in: 二行,第一行是一个正整数m;第二行是待修改的文档(字符串)。 输出文件3.out: 一行,修改后的文档(字符串) 样例 输入: 13 Thereare45studentsin32class.end 输出: Thereare58studentsin32class. var st,st1: string; i,k,m,sum: longint; ff: boolean; begin assign(input,'1.in'); assign(output,'1.out'); reset(input); rewrite(output); readln(m); readln(st); ff: =false; repeat st1: =copy(st,length(st)-2,3); ifst1='end'thendelete(st,length(st)-2,3) elseff: =true; untilff; i: =1; whilei<=length(st)do begin if(st[i]<='9')and(st[i]>='0')and(st[i-1]='') thenbegin k: =i;sum: =0; while(st[k]>='0')and(st[k]<='9')and(k<=length(st))do begin sum: =sum*10+ord(st[k])-48; k: =k+1; end; ifst[k]=''thenbegin write(m+sum); i: =k-1; end elsewrite(st[i]); end elsewrite(st[i]); i: =i+1; end; close(input); close(output); end. 第四题取数游戏(4.pas) 问题描述 给出2n(n<=100)个自然数(数小于等于30000)。 游戏双方分别为A方(计算机方)和B方(对弈的人)。 只允许从数列两头取数。 A先取,然后双方依次轮流取数。 取完时,谁取得的数字总
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复赛 练习 习题集