pascal习题集无分类由简到难.docx
《pascal习题集无分类由简到难.docx》由会员分享,可在线阅读,更多相关《pascal习题集无分类由简到难.docx(38页珍藏版)》请在冰豆网上搜索。
pascal习题集无分类由简到难
第一组训练题
1. 输入两个整数,按由大到小的顺序输出。
(1-1)
vara,b:
integer;
begin
readln(a,b);
ifa>=bthenwrite(a,b)elsewrite(b,a)
end.
(1-2)
vara,b:
integer;
begin
readln(a,b);
ifa>bthenwrite(a:
5,b:
5)elsewrite(b:
5,a:
5);
ifa=bthenwrite('a=b');
end.
2. 输入三个整数,按由大到小的顺序输出。
vara,b,c:
integer;
max,min:
integer;
begin
readln(a,b,c);
ifa>bthenbeginmax:
=a;min:
=bend
elsebeginmin:
=a;max:
=bend;
ifc>maxthenbeginmax:
=cend;
ifc=cend;
writeln(max:
5,a+b+c-max-min:
5,min:
5)
去掉最大的,去掉最小的,就是中间的,很有意思!
end.
3. 求和S=1+2+3+4+……10
varS,x:
integer;
Begin
S:
=0;
forx:
=1to10do
s:
=x+s;
writeln(s);
end.
4. 求乘积 S=1*2*3*4*……10
vars:
real;
x:
integer;
begin
s:
=1;
forx:
=1to10do
s:
=s*x;
writeln(s:
9:
0);
end.v
5. 计算S=1-1/2+1/3-1/4+1/5-1/6+1/7-1/8+1/9-1/10的值
vari:
integer;
s:
real;
Begin
i:
=1;s:
=0;
fori:
=1to10do
if(imod2)>0thens:
=s+1/I
elses:
=s-1/i; (此处很好!
)
writeln(s:
9:
4)
end.
6. 有一分数序列:
2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
vari,t,fz,fm:
integer;
s:
real;
begin
s:
=0;fz:
=2;fm:
=1;
fori:
=1to20do
begin
s:
=s+fz/fm;
t:
=fz+fm;
fm:
=fz;
fz:
=t;
end;
writeln(s:
8:
2);
end.
7. 输入10个数字,求其中最大的那个数字。
vara:
array[1..10]ofinteger;
i,max:
integer;
begin
fori:
=1to10doreadln(a[i]);
max:
=a[1];
fori:
=2to10doifa[i]>maxthenmax:
=a[i];(逐个比)
write('Max=',max);
end.
8. 输入10个数字,求其中次大的那个数字。
vara:
array[1..10]ofinteger;
i,max1,max2:
integer;
begin
fori:
=1to10doreadln(a[i]);
ifa[1]>a[2]thenbeginmax1:
=a[i];max2:
=a[2];end
elsebeginmax1:
=a[2];max2:
=a[1];end;
fori:
=3to10do
ifa[i]>max1thenbeginmax2:
=max1;max1:
=a[i]end;(max1用来比,max2接替max1)
write('Max2=',max2);
end.
9. 求和S=1+2+4+7+11……n(其中n是小于100的最大整数)(?
)
vars,a,i:
integer;
begin
s:
=0;a:
=1;i:
=1;
whilea<100do
begin
i:
=i+1;s:
=a+s;
s:
=s+a;a:
=a+i;
a:
=a+i-1;i:
=i+1
end;
writeln(s);
end.
10. 求和S=1+2+4+8+16+32+……n(n是小于1000的最大整数)
vars,i:
integer;
begin
s:
=0;i:
=1;
while(i<1000)do
begin
s:
=s+i;
i:
=i*2;
end;
writeln(s)
end.
11. 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
var
a,b,c,i,n:
integer;
s:
real;
begin
readln(n);
a:
=1;b:
=0;s:
=a+b;
fori:
=1ton-2do
begin
c:
=a+b;
s:
=s+c;
a:
=b;
b:
=c;
end;
writeln(s:
9:
4);
end.
12. 打印出小九九乘法口诀表。
var
i,j:
integer;
begin
writeln;
fori:
=1to9do
begin
forj:
=1toidowrite(i:
1,'*',j:
1,'=',i*j:
1,'');
writeln;
end;
end.
vari,j:
integer;
begin
fori:
=1to9do
begin
forj:
=1toido
write(i,'*',j,'=',i*j,'');
writeln;
end;
end.
13. 满足A3+B3+C3=ABC的数字称为水仙花数,求所有的100-999之间的水仙花数。
vara,b,c:
integer;
begin
fora:
=1to9do
forb:
=0to9do
forc:
=0to9do
ifa*a*a+b*b*b+c*c*c=100*a++10*b+c
thenwriteln(a,b,c);
end.
14. 判断输入的一个正整数是否是素数。
varn,i:
integer;
b:
boolean;
begin
readln(n);i:
=2;b:
=True;
whileband(i<=SQRT(n))do
if(nmodi)=0thenb:
=false
elsei:
=i+1;
ifb=Truethenwriteln('Yes')
elsewriteln('No');
end.
15. 将一个正整数分解质因数。
例如:
输入90,打印出90=2*3*3*5。
var
n,i:
integer;
begin
readln(n);
i:
=2;
whilenmodi<>0doi:
=i+1;
write(n,'=',i);n:
=ndivi;
whilei<=ndo
begin
whilenmodi=0do
begin
write('*',i);
n:
=ndivi;
end;
i:
=i+1;
end;
end.
16. 输入两个正整数m和n,求其最大公约数和最小公倍数。
var
m,n:
integer;
functionasd(a,b:
integer):
integer;
varx,y,i,j:
integer;
begin
i:
=a;j:
=b;
x:
=amodb;
whilex<>0do
begin
a:
=b;
b:
=x;
x:
=amodb;
end;
x:
=b;
writeln('[',a,',',b,']','=',x);
y:
=j*idivb;
writeln('(',a,',',b,')','=',y);
end;
begin
readln(m,n);
asd(m,n);
end.
17. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
例如2+22+222+2222+22222(此时共有k=5个数相加),输入a和k,求s。
var
i,a,k:
integer;
s,t:
real;
begin
readln(a,k);
s:
=a;t:
=a;
fori:
=2tokdo
begin
t:
=t*10+a;
s:
=s+t;
end;
write('S=',a,'+..+',t:
0:
0,'=',s:
0:
0);
end.
18. 一个不超过5位的整数,判断它是不是回文数。
即12321是回文数,个位与万位相同,十位与千位相同。
var
s:
string;b:
boolean;i,j:
integer;
begin
read(s);
j:
=length(s);
i:
=1;
b:
=true;
while(i<=j)andbdo
begin
b:
=(s[i]=s[j]);
i:
=i+1;
j:
=j-1;
end;
ifbthenwriteln('yes')
elsewriteln('no');
end.
19. 输入某年某月某日,判断这一天星期几。
const
a:
array[1..12]ofinteger=(31,28,31,30,31,30,31,31,30,31,30,31);
b:
string='SunMonTueWedThiFriSat';
var
year,month,day,i,s:
integer;
begin
readln(year,month,day);
s:
=0;
fori:
=1toyear-1do
begin
s:
=(s+365)mod7;
ifimod4=0thens:
=s+1;
ifimod100=0thens:
=s-1;
ifimod400=0thens:
=s+1;
end;
fori:
=1tomonth-1dos:
=s+a[i];
if(yearmod400=0)or((yearmod4=0)and(yearmod100<>0))then
ifmonth>2thens:
=s+1;
s:
=(s+day)mod7;
fori:
=3*s+1to3*s+3dowrite(b[i]);
end.
20. 输入10个整数,按由大到小的顺序输出。
type
arr=array[1..10]ofinteger;
var
i,j,k:
integer;
a:
arr;
begin
fori:
=1to10doread(a[i]);
readln;
fori:
=1to9do
forj:
=1to10-ido
ifa[j]begin
k:
=a[j];
a[j]:
=a[j+1];
a[j+1]:
=k;
end;
fori:
=1to10dowrite(a[i]:
2);
end.
21. 已知N!
=1*2*3*……N,求S=1!
+2!
+3!
+4!
+ ……10!
var
i,j:
integer;
s:
real;
functionfac(i:
integer):
real;
var
j:
integer;s:
real;
begin
s:
=1;forj:
=1toidos:
=s*j;fac:
=s;
end;
begin
s:
=0;
fori:
=1to10dos:
=s+fac(i);
writeln(s);
end.
22. 同上,求S=1!
+(1!
+3!
)+(1!
+3!
+5!
)+ ……(1!
+3!
+5!
+ ……13!
)
var
j,i:
integer;
s:
real;
functionfac(a:
integer):
real;
vark:
integer;
b:
real;
begin
b:
=1;
fork:
=1toadob:
=b*k;
fac:
=b;
end;
begin
fori:
=1to7do
forj:
=1toi*2-1do
ifjmod2=1then
begin
s:
=s+fac(j);
end;
writeln(s:
8:
0);
end.
23. 进制转换,给定一个十进制的数字n,将它转换成 十六进制等值的数字。
24. 有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到5报数),凡报到5的人退出圈子,问最后留下的是原来第几号的那位,输入n,输出最后那个人的编号。
const
n=10;
var
a:
array[1..n]ofboolean;
i,j,k:
integer;
begin
writeln;
fori:
=1tondoa[i]:
=true;
i:
=0;j:
=0;k:
=0;
whilejbegin
i:
=i+1;
ifi>ntheni:
=1;
ifa[i]then
begin
k:
=k+1;
ifk=5then
begin
a[i]:
=false;
write(i:
3);
k:
=0;
j:
=j+1;
end;
end;
end;
end.const
n=10;
var
a:
array[1..n]ofboolean;
i,j,k:
integer;
begin
writeln;
fori:
=1tondoa[i]:
=true;
i:
=0;j:
=0;k:
=0;
whilejbegin
i:
=i+1;
ifi>ntheni:
=1;
ifa[i]then
begin
k:
=k+1;
ifk=5then
begin
a[i]:
=false;
write(i:
3);
k:
=0;
j:
=j+1;
end;
end;
end;
end.
25. 已知无穷小数 X=0.1234567891011…9899100101…,其中的数字是依次写下各自然数而得到的。
试求出小数点后第 n 位数字。
输入:
从键盘输入 n。
(n<=200)输出:
输出小数点后第 n (180以内)位数字。
var
i,j,k,n:
integer;
begin
readln(n);
ifn<10thenwriteln(n)
else
begin
i:
=9+(n-8)div2;
ifnmod2=0thenk:
=idiv10
elsek:
=imod10;
writeln(k);
end;
end.
26. 螺旋方阵和数字三角形。
(26-1)
var
a:
array[1..5,1..5]ofinteger;
i,j,k,u,d,l,r:
integer;
begin
k:
=1;l:
=1;r:
=5;u:
=1;d:
=5;
whilek<=25do
begin
fori:
=utoddobegina[i,l]:
=k;k:
=k+1;end;l:
=l+1;
fori:
=ltordobegina[d,i]:
=k;k:
=k+1;end;d:
=d-1;
fori:
=ddowntoudobegina[i,r]:
=k;k:
=k+1;end;r:
=r-1;
fori:
=rdowntoldobegina[u,i]:
=k;k:
=k+1;end;u:
=u+1;
end;
fori:
=1to5do
begin
forj:
=1to5dowrite(a[i,j]:
3);
writeln;
end;
end.
(26-2)
var
a:
array[1..10,1..10]ofinteger;
i,j,k,u,d,l,r,n:
integer;
begin
readln(n);
k:
=1;l:
=1;r:
=n;u:
=1;d:
=n;
whilek<=n*ndo
begin
fori:
=utoddobegina[i,l]:
=k;k:
=k+1;end;l:
=l+1;
fori:
=ltordobegina[d,i]:
=k;k:
=k+1;end;d:
=d-1;
fori:
=ddowntoudobegina[i,r]:
=k;k:
=k+1;end;r:
=r-1;
fori:
=rdowntoldobegina[u,i]:
=k;k:
=k+1;end;u:
=u+1;
end;
fori:
=1tondo
begin
forj:
=1tondowrite(a[i,j]:
3);
writeln;
end;
end.
27. 打印N行的杨辉三角。
var
a:
array[1..10,1..10]ofinteger;
i,j,n:
integer;
begin
readln(n);
fori:
=1to10do
forj:
=1to10doa[i,j]:
=0;
fori:
=1to10doa[i,1]:
=1;a[i,i]:
=1;
writeln(1:
n);
fori:
=2tondo
begin
write(a[i,1]:
n-i+1);
forj:
=2toido
begin
a[i,j]:
=a[i-1,j-1]+a[i-1,j];
write(a[i,j]:
3);
end;
writeln;
end;
end.
28. 高精度整数加法。
输入两个不超过100位的正整数,求它们的和。
var
s1,s2,s3:
string;k,k1,k2,k3,l1,l2,i:
integer;
begin
readln(s1);readln(s2);
l1:
=length(s1);l1:
=length(s2);
ifl1>l2thenfori:
=1tol1-l2dos2:
=s2+'0';
l1:
=length(s1);l1:
=length(s2);
k:
=0;s3:
='';
fori:
=l1downto1do
begin
k1:
=ord(s1[i])-ord('0');
k2:
=ord(s2[i])-ord('0');
k3:
=k+k1+k2;
ifk3>=10thenbegink:
=1;k3:
=k3-10;end
elsek:
=0;
s3:
=chr(k3+ord('0'))+s3;
end;
ifk=1thens3:
='1'+s3;
writeln(s3);
end.
29. 高精度实数减法。
输入两个不超过100位的正整数,求它们的差。
var
i,k:
integer;
s1,s2,s3:
string;
k1,k2,k3:
integer;
l1,l2:
integer;
begin
readln(s1);readln(s2);
l1:
=length(s1);l2:
=length(s2);
if(l1begin
s3:
=s1;
s1:
=s2;
s2:
=s3;
write('-');
end;
l1:
=length(s1);l2:
=length(s2);
fori:
=1tol1-l2dos2:
='0'+s2;
k:
=0;s3:
='';
fori:
=l1downto1do
begin
k1:
=ord(s1[i])-ord('0');
k2:
=ord(s2[i])-ord('0');
k3:
=k1-k2-k;
ifk3<0thenbegink3:
=k3+10;k:
=1;end
elsek:
=0;
s3:
=chr(ord('0')+k3)+s3;
end;
while(length(s3)>1)and(s3[1]='0')dodelete(s3,1,1);
writeln(s3);
end.
30. 高精度整数乘法。
输入两个不超过100位的正整数,求它们的乘积。
var
s1,s2:
string;
a,b,c:
array[0..9]ofinteger;
i,j,k:
integer;
begin
readln(s1);k:
=length(s1);
fori:
=0tok-1doa[i]:
=ord(s1[k-i])-ord('0');
readln(s2);k:
=length(s2);
fori:
=0tok-1dob[i]:
=ord(s2[k-i])-ord('0');
fori:
=0to9doc[i]:
=0;
fori:
=0to9do
forj:
=0to9doc[i+j]:
=c[i+j]+a[i]*b[j];
fori:
=0to7do
begin
k:
=c[i];
c[i]:
=c[i]mod10;
c[i+1]:
=c[i+1]+kdiv10;
end;
j:
=9;
while(c[j]=0)and(j>0)doj:
=j-1;
fori:
=jdownto0dowrite(c[i]);
end.
31. 高精度实数加法减法。
输入两个不超过100位的正实数,求它们的和或者差。
var
s1,s2,s3:
string;
l1,l2:
integer;
x1,x2,z1,z2:
integer;
pointpos:
integer;
i,j,k:
integer;
begin
readln(s1);readln(s2);
k:
=pos('.',s1);ifk=0thens1:
=s1+'.';
k:
=pos('.',s2);ifk=0thens2:
=s2+'.';
l1:
=length(s1);k:
=pos('.',s1);z1:
=k-1;x1:
=l1-k;
l2:
=length(s2);k:
=pos('.',s2);