2014noip复赛模拟练习1(答案)
![2014noip复赛模拟练习1(答案)](https://img.360docs.net/img79/03negd9qrg62oqmnrtxz-91.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【问题描述】请统计某个给定范围[L,R]的所有整数中,数字N出现的次数。
【输入格式】共1行,为三个正整数L、R和N,之间用空格隔开。(1≤L≤R≤10000)。
【输出格式】仅1行,表示数字N出现的次数。
如输入2 22 2 则输出6
var a,b,c,d,e,f,n:integer;
begin
assign(input,'two.in');reset(input);
assign(output,'two.out');rewrite(output);
readln(a,b,n);
f:=0;d:=0;
for c:=a to b do
begin
e:=c;
repeat
d:=e mod 10;
e:=e div 10;
if d=n then inc(f);
until e=0;
end;
writeln(f);
close(input);close(output);
end.
输入2 100 5输出 20 输入 1 1000 9 输出 300
输入 2222 2223 2 输出 7 输入 9993 10000 2 输出 0
2.用自然数1,2,3,4,5,。。。。。构成连续数1234567891011…9899100101…从键盘输入整数m(20000
m),输出第m位数字。
样例输入输出:输入:m=15输出:2
①m=1
1
②m=19
4
③m=10000
7
④m=19999
2
var p,d,i,j,w,c,m:integer;
begin
write('m=');readln(m);
c:=1;i:=1;
while c i:=i+1; w:=1;j:=i; while j>=10 do begin j:=j div 10; w:=w+1; end; c:=c+w; end; d:=c-m+1; for j:=1 to d do begin p:=i mod 10; i:=i div 10; end; writeln(p); end. 3.聪明的囚犯:传说从前有一个残暴的国王,喜欢杀戮百姓。有一次,他抓到30个百姓并要一一杀掉。在这30个百姓中间有一个聪明人,他站出来对国王说:“请国王打发慈悲,赦免两个人不死。”国王问:“赦免哪两个人不死?”那个聪明人回答说:“我们30个人围成一圈,从1开始报数,凡数到5的人就拉出去杀掉,剩下的人继续从1开始报数,循环反复,直到剩下两个人为止,这两个人被赦免。”国王一听很有意思,就同意了聪明人的建议,叫这30个百姓围成一圈,依依报数,凡数到5的就杀掉。最后只剩下两个人没有被杀掉,而聪明人就是其中之一。编写程序,输入N个百姓,由计算机判断一下,聪明人要站在什么位置,才能躲过这场屠杀。 var a:array[1..1000] of 0..1; n,m,s,f,t,S1:integer; begin readln(n,m); for t:=1 to m do a[t]:=0; f:=0;t:=0;s:=0; repeat t:=t+1; if t=n+1 then t:=1; if a[t]=0 then s:=s+1; if s>=m then begin s:=0;S1:=S1+1; IF S1>=N-1 THEN write(t,’’);a[t]:=1;f:=f+1; end; until f>=n; readln; end. 输入45 5(11 41)56 5(12 49)83 5(234 786) 4. 算盘,这个古老的计算工具是我国古代的重要发明。 在算盘上,一个档相当于整数的一位,高位在左边,所以,从右向左数,各档依次表示个位、十位、百位、……,在每个档上,靠框的珠不参与计数,靠梁的珠参与计数,且梁上面的珠每个表示5,梁下面的珠每个表示1,并规定0用本档上所有的珠都靠框来表示。根据这个规则,上面的算盘就表示拨入了一个整数123456789(其它的档,认为是0)。 算盘的初始状态是所有的珠都靠框,即所有档上都是0。请编写程序计算一下,从初始状态拨入一个整数n(位数≤17),一共需要拨动多少个珠? 样例输入: 8102 样例输出: 7 var c:char; sum,n:integer; begin sum:=0; repeat read(c); if ord(c)=13 then break; n:=ord(c)-ord('0'); if n>=5 then n:=n-4; sum:=sum+n; until false; writeln(sum); end. 1、输入: 12345678901234567 输出: 41 2、输入: 700 输出: 3 3、输入: 1000005 输出: 2 4、输入: 47688798803132 输出: 42 5.现在有一个长度为N(1<=N<=1000)的并且每个数只可能是1或2或3的数列,求至少要交换多少次,才能得到一个升序的序列。如输入N=5, 1 3 3 2 2则输出2 var a:array[1..1000] of integer; n,i,j,t,n1,n2,m:longint; begin assign(input,'sort3.in'); assign(output,'sort3.out'); reset(input);rewrite(output); fillchar(a,sizeof(a),0); readln(n);n1:=0;n2:=0;m:=0; for i:=1 to n do begin read(a[i]); if a[i]=1 then inc(n1); if a[i]=2 then inc(n2); end; for i:=1 to n1 do if a[i]=2 then begin inc(m);j:=n1; repeat inc(j) until a[j]=1; t:=a[i];a[i]:=a[j];a[j]:=t; end else if a[i]=3 then begin inc(m);j:=n+1; repeat dec(j) until a[j]=1; t:=a[i];a[i]:=a[j];a[j]:=t; end; for i:=n1+1 to n1+n2 do if a[i]=3 then begin inc(m);j:=n+1; repeat dec(j) until a[j]=2;