当前位置:文档之家› noip普及组编程模拟试题1(答案)

noip普及组编程模拟试题1(答案)

一、问题描述:
考虑在0和1之间的所有分母不大于N的最简分数。

下面是N = 5时的情况:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
问题求解:
编写一个程序,对于一个给定的整数N(1≤N≤100),按从小到大的顺序打印出这些分数,同时打印出它们的总的个数。

输入输出示例:
N = 5
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
TOTAL = 11
var
a,b : array[1..5000] of integer;
i,j,k,n,t : integer;
function gcd(x,y : integer) : integer;
var z : integer;
begin
while y > 0 do begin
z := x mod y;
x := y;
y := z;
end;
gcd := x;
end;
begin
repeat
write('N = ');
readln(n);
until n in [1..100];
t := 0;
for i := 2 to n do
for j := 1 to i-1 do
if gcd(i,j) = 1 then begin
inc(t); a[t] := j; b[t] := i;
end;
for i := 1 to t-1 do
for j := i+1 to t do
if a[i]*b[j] > a[j]*b[i] then begin
k := a[i]; a[i] := a[j]; a[j] := k;
k := b[i]; b[i] := b[j]; b[j] := k;
write('0/1',#9);
for i := 1 to t do write(a[i],'/',b[i],#9);
writeln('1/1',#9);
writeln('Total = ',t+2);
readln;
end.
输入100 输出3045 输入1 输出 2
二、某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。

我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。

这些区域用它们在数轴上的起始点和终止点表示。

已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。

现在要把这些区域中的树(包括区域端点处的两棵树)移走。

你的任务是计算将这些树都移走后,马路上还有多少棵树。

【输入文件】
输入文件tree.in的第一行有两个整数L(1 <= L <= 10000)和M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。

接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

【输出文件】
输出文件tree.out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

【样例输入】
500 3
150 300
100 200
470 471
【样例输出】
298
【数据规模】
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。

var tree1:array[0..10000]of 0..1;
l,m,i,j,b,e:integer;
begin readln(l,m);
for i:=0 to l do tree1[i]:=1;
for i:=1 to m do
begin readln(b,e);
for j:=b to e do tree1[j]:=0;
end;
j:=0;for i:=0 to l do
if tree1[i]=1 then j:=j+1;
writeln(j);
end.
输入10000 10
123 134
1321 3123
3333 4444
9999 10000
8888 9988
4555 4666
5000 6000
8007 8887
6777 8000
输出2411
三.代数表达式的定义如下:




式:
项:

子:

母:
例如,下面式子是合法的代数表达式:
a;
a+b*(a+c);
a*a/(b+c);
下列式子是不合法的代数表达式:
ab;
a+b*(c+d); {因子中无字母d}
程序要求:
输入:输入一个字符串,以";"结束,(";"本身不是代数表达式中字符,仅作为结束符号) 输出:若表达式正确,则输出:"OK";
若表达式不正确,则输出"ERROR",及错误类型
错误类型约定:
1.式子中出现不允许的字符;
2.括号不配对;
3.其他错误
例如:输入a+(b);
输出:OK
例如:输入a+(b+c*a;
输出 error 2
const charset:set of char=['a'..'c','+','-','*','/','(',')'];
var i,left:integer;ex:string;
procedure error(code:integer);
begin writeln('error',code);
halt
end;
begin write('input a expression:');
readln(ex);
for i:=1 to length(ex) do
if not(ex[i] in charset) then error(1);
left:=0;i:=1;
while (left>=0) and (i<=length(ex)) do
begin if ex[i]='(' then left:=left+1 else
if ex[i]=')' then left:=left-1;
i:=i+1;
end;
if left<>0 then error(2);
if ex[1] in ['+','-','*','/'] then error(3);
if ex[length(ex)] in ['+','-','*','/'] then error(3);
for i:=2 to length(ex)-1 do
case ex[i-1] of
'(': if ex[i] in ['+','-','*','/',']'] then error(3);
')': if ex[i] in ['(','a','b','c'] then error(3);
'+','-','*','/': if ex[i] in ['+','-','*','/',']'] then error(3); 'a'..'c':if ex[i] in ['a','b','c','('] then error(3);
end;
writeln('OK');
end.。

相关主题