六安一中信息学奥赛教程第1部分——语言篇 by jjh
var e,p:real; i:longint; begin
e:=1;p:=1;i:=1; while p>=1e-7 do
begin p:=p/i; e:=e+p; inc(i); end;
writeln(?e=?,e); end.
程序2-12:求ex的值。(保留4位小数)
x2x3xixiexp(x)?1?x???...?(??10?10)
2!3!i!i!var i,x:integer;
t,s:real; begin
readln(x); i:=0;t:=1;s:=1;
while abs(t)>1e-10 do
begin inc(i); t:=t*x/i; s:=s+t; end;
writeln(s:0:4); end.
21
六安一中信息学奥赛教程第1部分——语言篇 by jjh
2.3 文件操作
程序2-13:数据统计
从“d1.txt”文本文件中读入数据,求出它们的最小值,最大值和平均值(保留3位小数),并把它们输出到“d2.txt”文本文件中。保证“d1.txt”里的这些数都是不超过1000的整数。 样例输入(d1.txt):
2 8 3 5 1 7 3 6 样例输出(d2.txt): 1 8 4.375
var x,n,s,min,max:longint; f1,f2:text; begin
assign(f1,'d1.txt');reset(f1); assign(f2,'d2.txt');rewrite(f2); n:=0;s:=0;min:=0;max:=0; while not eof(f1) do begin
read(f1,x); s:=s+x;
if x
writeln(f2,min,max,s/n); close(f2); end.
本程序中有一语句:s:=s+x,s在前面一直没有出现赋初值,这有可能导致结果不正确。 提示:变量在未赋值之前的值是不确定的。特别地,它不一定等于0。
本程序中使用了使用文件输入输出,而非标准输入输出。在使用文件输入输出时,首先申明文件类型的变量:f1,f2:text;
在输入输出之前需要初始化: 读文件:assign(f1,”d1.txt”);reset(f1); 写文件:assign(f2,”d2.txt”);rewrite(f2);
输入输出以后一定要关闭文件: close(f1);close(f2);
程序2-14:正因子个数
输入正整数n,统计它的正因子个数,并保存到文本文件“a1.out”中。n<=1012。 样例输入:30 样例输出:8 【分析】
本题可以直接枚举,如果i是n的约数,则n div i也是n的约数,除非i=n div i。i和n div i恰好有一个不超过n的算术平方根。这样,从1枚举到sqrt(n)即可。 var i,n:longint; f1:text;
22
六安一中信息学奥赛教程第1部分——语言篇 by jjh
begin
assign(f1,”a1.out”);rewrite(f1); readln(n); tot:=0;
for i:=1 to trunc(sqrt(n)) do if n mod i=0 then inc(tot); writeln(f1,tot); close(f1); end.
上机练习
1.位数(digit.pas)
输入一个不超过109的正整数,输出它的位数。例如12735的位数是5。请不要使用任何数学函数,只用四则运算和循环结构实现。 2.水仙花数(daffodil.pas)
输入100—999中的所有水仙花数。若3位数ABC满足ABC=A3+B3+C3,则称其为水仙花数。例如153=13+53+33,所以153是水仙花数。 3.最大公约数(gcd.pas)
输入两个数m和n,求m和n的最大公约数。 4.韩信点兵(hanxin.pas)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。 样例输入:2 1 6 样例输出:41 样例输入:2 1 3
样例输出:No answer 5.字母塔(ztower.pas) 输入n,输出n行的字母塔。 例如n=4时,输出
A ABA ABCBA ABCDCBA ABCBA ABA A
6.调和级数(harmony.pas)
输入正整数n,输出H(n)?1?样例输入:3 样例输出:1.833
7.近似计算(approximation.pas)
23
111??...?的值,保留3位小数。 23n六安一中信息学奥赛教程第1部分——语言篇 by jjh
计算
?111?1????...,直到最后一项小于10-6。 4357111,保留5位小数。 ??...?n2(n?1)2m28.子序列的和(subsequence.pas)
输入两个正整数n 样例输入1:2 4 样例输出1:0.42361 样例输入2:65536 655360 样例输出2:0.00001 注意:本题有陷阱。 9.分数化小数(decimal.pas) 输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=106,c<=100。 样例输入:1 6 4 样例输出:0.1667 10.排列(permutation.pas) 用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出所有解。 11.逻辑判断(logic.pas) 四个学生上地理课时,回答我国四大淡水湖的大小时这样说。 甲:“最大洞庭湖,最小洪泽湖,鄱阳湖第三”; 乙:“最大洪泽湖,最小洞庭湖,鄱阳湖第二,太湖第三”; 丙:“最小洪泽湖,洞庭湖第三”; 丁:“最大鄱阳湖,最小太湖,洪泽湖第二,洞庭湖第三”;对于每个湖的大小,每个学生仅答对一个,请编程确定四个湖的大小。 12.亲密数对(qmnum.pas) 求2—1000中的亲密数对(如果a的因子和等于b,b的因子和等于a,且a<>b,则称a,b为亲密数对)。 24

