2014noip复赛模拟练习1(答案)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档