请点击进入:信息奥赛Pascal复习
【例1】求3!+5!+7!的值。
Program p1_1 (input,output);
Var s:integer;
Function fac(n:integer);integer;{定义求n!的函数fac}
Var k,t:integer;
Begin
T:=1;
For k:=2 to n do
T:=t*k;
Fac:=t;
End;
Begin{主程序}
S:=fac(3)+fac(5)+fac(7);
Writeln(‘s=’,s)
End.
运行结果:
s=5166
【例2】计算如图7—2多边形的面积。
从图中可以看出,五边形的面积是三个三角形面积之和。

Program p7_4(input,output);
Var b1,b2,b3,b4,b5,b6,b7,s:real;
Function area(a,b,c:real):real;
Var
P:real;
Begin
P:=(a+b+c)/2;
Area:=sqrt(p*(p-a)*(p-b)*(p-c));
End.
Begin
Write(‘please input b1,b2,b3,b4,b5,b6,b7:’);
Readln(b1,b2,b3,b4,b5,b6,b7);
S:=area(b1,b5,b6)+area(b2,b6,b7)+area(b3,b4,b7);{三次调用函数area}
Writeln(‘s=’,s:10:3);
End;
运行:
please input b1,b2,b3,b4,b5,b6,b7: 2 2 2 2 2 3 3
s=6.797
【例3】 用过程编写求如上面五边形的面积。
Program p1_3(input,output);
Var b1,b2,b3,b4,b5,b6,b7,s,sum:real;
Procedure area(a,b,c:real;var s:real);
Var p:real;
Begin p:=(a+b+c)/2;
S:=sqrt(p*(p-a)*(p-b)*(p-c));
End;
Begin{主程序}
Write(‘please input b1,b2,b3,b4,b5,b6,b7:’);
Readln(b1,b2,b3,b4,b5,b6,b7);
Sum:=0;
Area(b1,b5,b6,s);
Sum:=sum+s;
Area(b2,b6,b7,s);
Sum:=sum+s;
Area(b3,b4,b7,s);
Sum:=sum+s;
Writeln(‘s=’,s:10,3);
End.
运行:
please input b1,b2,b3,b4,b5,b6,b7:2 2 2 2 2 3 3
s=6.797
【例4】从键盘输入一系列字符,编程分别统计出其中的数字字符、字母字符和其他字符的个数,输入“?”时表示程序结束。
程序代码如下:
program px8_2(input,output);
var ch:char;
letter:set of char;
digit:set of ‘0’..’9’;
k,m,n:integer;
begin
letter:=[‘A’..’Z’,’a’..’z’];
digit:=[‘0’..’9’];
k:=0;n:=0;m:=0;
repeat
read(ch);
if ch in letter then k:=k+1
else if ch in digit then n:=n+1
else m:=m+1;
until ch=’?’;
writeln(‘letter=’,k:6,’digit=’,n:6,’other=’,m-1:6);
{注意:空格也算一个其他类的字符,但应减去最后一个“?”}
end.
输入一个样例:abc&ddd$12345#?
输出样例的结果:letter=6 ditit=5 other=4
【看程序写出结果】
(1) PROGRAM NOI__001;
VAR I,J,L,N,K,S,T: INTEGER;
B : ARRAY[1..10] OF 0..9;
BEGIN
READLN(L,N);S:=L; K:=1; T:=L;
WHILE S<N DO
BEGIN K:=K+1; T:=T*L; S:=S+T END;
S:=S-T; N:=N-S-1;
FOR I:=1 TO 10 DO B[I]:=0;
J:=11;
WHILE N>0 DO
BEGIN J:=J-1; B[J]:=N MOD L; N:=N DIV L END;
FOR I:=10-K+1 TO 10 DO WRITE(CHR(ORD('A')+B[I]));
END
输入:4 167
输出:
(2) PROGRAM NOI__002;
VAR I,J,J1,J2,P,Q: INTEGER;
P1 : BOOLEAN;
B,C : ARRAY[1..100] OF INTEGER;
BEGIN
READLN(Q,P); J:=1; P1:=TRUE; B[J]:=Q; J1:=0;
WHILE (Q>0) AND P1 DO
BEGIN
J1:=J1+1; C[J1]:=Q*10 DIV P; Q:=Q*10-C[J1]*P;
IF Q>Q THEN BEGIN
J2:=1;
WHILE (B[J2]<>Q) AND (J2<=J) DO J2:=J2+1;
IF B[J2]=Q THEN
BEGIN
P1:=FALSE; WRITE('0.');
FOR I:=1 TO J2-1 DO WRITE(C[I]:1);
WRITE('{'};
FOR I:=J2 TO J1 DO WRITE(C[I]:1);
WRITELN(')')
END
ELSE BEGIN J:=J+1; B[J]:=Q END
END
END;
IF Q=0 THEN BEGIN
WRITE('0.');
FOR I:=1 TO J1 DO WRITE(C[I]:1);
WRITELN
END;
READLN
END.
输入 ①1 8 输出
输入 ②2 7 输出
[穷举法]古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。
问题分析
(1) 本题是一个搜索问题,搜索范围2~1000,找出该范围内的完全数;
(2) 完全数必须满足的条件:因子的和等于该数的本身;
(3) 问题关键在于将该数的因子一一寻找出来,并求出因子的和:分解因子的方法比较简单,采用循环完成分解因子和求因子的和。
程序如下:
program p1;
var a,b,s:integer;
begin
for a:=2 to 1000 do
begin
s:=0;
for b:=1 to a-1 do
if a mod b =0 then s:=s+b;
if a=s then begin
write(a,'=',1,);
for b:=2 to a-1 do
if a mod b=o then write('+',b);
writeln;
end;
end;
end.
当程序运行后,输出结果:
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
邮局发行一套票面有四种不同值的邮票,如果每封信所帖邮票张数不超过三枚,存在整数r,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3、……、r来,找出这四种面值数,使得r值最大。
问题分析:知道每封信邮票数的范围(<=3),邮票有四种类型,编程找出能使面值最大邮票。其算法是:
(1) 面值不同的四种邮票,每封信所贴邮票不超过3张;
(2) 用这四种邮票贴出连续的整数,并且使r值最大;
(3) 用穷举法,找出所有符合条件的解;
(4) 本题用集合的方法统计邮票的面值,提高判重的速度。
设四种邮票的面值分别为:a,b,c,d,根据题意设:
a<b<c<d,因此a=1,用循环语句完成搜索。
Program p12-3;
Var a,b,c,d:integer;
X,x0,x1,x2,x3,x4:integer;
st1:set of 1..100;
function number(a,b,c,d:integer):integer;
var n1,n2,n3,n4,sum:integer;
begin
st1:=[];
for n1:=0 to 3 do
for n2:=0 to 3-n1 do
for n3:=0 to 3-n1-n2 do
for n4:=0 to 3-n1-n2-n3 do
begin
if n1+n2+n3+n4<=3 then
begin
sum:=n1*a+n2*b+n3*c+n4*d;
st1:=st1+[sum];
end;
end;
sum:=1;
while sum in st1 do
sum:=sum+1;
number:=sum-1;
end;
begin
a:=1;x0:=0;
for b:=a+1 to 3*a+1 do
for c:=b+1 to 3*b+1 do
for d:=c+1 to 3*c+1 do
begin
x:=number(a,b,c,d);
if x>x0 then
begin
x0:=x;x1:=a;x2:=b;x3:=c;x4:=d;
write(x1:5,x2:5,x3:5,x4:5);
writeln(‘’:10,’x0=’,x0);
end;
end;
end.
程序运行后,其输出结果是:
1 2 3 4 x0=12
1 2 3 5 x0=13
……
1 3 6 10 x0=23
1 4 7 8 x0=24
[不同进制数的转换及应用] 用质量为1g,3g,9g,27g和81g的砝码称物体的质量,最大可称121g.如果砝码允许放在天平的两边,编程输出称不同物体时砝码应该怎样安排?例如m=14时,m+9+3+1=27或m=27-9-3-1.即天平一端放m=14克的物体和9g,3g,1g的砝码,另一端放27g的砝码.
问题分析:
(1) 被称物质的质量计算的数学原理:设被称物质m放在天平左边,根据天平平衡原理,左边质量应等于天平右边质量.
(2) 问题关键在于算法中如何体现砝码放在天平左边,右边参加称量.这里可以用-1,1,0表示砝码放在天平左右和没有参加称量,再没有其他数,所以称为三进制数,每个砝码都有这样的三种状态.
(3) 被称物体质量计算:m=a*81+b*27+c*9+d*3+e
这里a,b,c,d,e分别表示81,27,9,3,1克的砝码是放在天平的左边,右边,其程序表示如下:
program p12-7;
var a,b,c,d,e,m:integer;
begin
for m:=1 to 121 do
for a:=0 to 1 do
for b:=-1 to 1 do
for c:=-1 to 1 do
for d:=-1 to 1 do
for e:=-1 to 1 do
if m=a*81+b*27+c*9+d*3+e then
begin
writeln(m,’=’,a*81,’+’,b*27,’+’,c*9,’+’,d*3,’+’,e);
readln;
end;
end.
运行结果是:
1=0+0+0+0+1
……..
31=0+27+0+3+1
………
121=81+27+9+3+1
请同学们务必在国庆节期间搞懂上述的每一道题,以起到以点带面的作用,不明白的地方一定要提出来,我们不追求多,但追求精,考试时也是同样原则:会做的题就一定力求拿到满分。祝同学们国庆愉快!
视频
图片
图书


