当前位置:首页 > 挺好的pascal教程
数就是a,b的最小公倍数。 program ex13;
var a,b,n,s:integer; begin
writeln('input a,b'); readln(a,b); n:=0; repeat n:=n+1; s:=a*n;
until (s mod b=0) and (s mod a=0); writeln(s); readln; end.
用这样的方法做,会易懂的多哦。
例3,校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至少是多少人? 解:
①设校体操队为X人,根据题意X应是7的倍数,因此X的初值为7,以后用inc(x,7)改变X值; program ex03; var x:integer; begin x:=0; repeat inc(x,7); until
(x mod 2=1) and (x mod 3=1) and (x mod 4=1) and (x mod 5=1) and (x mod 6=1); writeln(x); end.
答案:301人
试一试:在一千多年前的《孙子算经》中,有这样一道算术题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”按照今天的话来说:一个数除以3余2,除以5余3,除以7余2,求这个数。现在我们稍微改变一下:一个数除以 3余2,除以5余3,除以7余2,求符合条件的最小数 program exsys; var a,s:integer; begin
a:=1; s:=8; repeat s:=s+a until
(s mod 3=2) and (s mod 5=3) and (s mod 7=2); writeln(s); readln; end. 答案:23
例4、从键盘输入一个整数X(X不超过10000),若X的各位数字之和为7的倍数,则打印“Yes”,否则打印“No”。
解:本题考察的是数字分离的方法,由于X的位数不定,所以以往的解法不能奏效,这是介绍一种取余求商法。
(1)用X mod 10分离出X的个位数字;
(2)用X div 10将刚分离的个数数字删除,并将结果送回给X; (3)重复(1)(2)直到X=0。 repeat
a:=x mod 10;
x:=x div 10; s:=s+a; until x=0;
说明:小数除以大数求余数,商为0,余数为小数本身。 程序:
Program ex12; var x,a,s:integer; begin
writeln('input x'); readln(x); s:=0; repeat
a:=x mod 10; x:=x div 10; s:=s+a; until x=0;
if s mod 7=0 then writeln('Yes') else writeln('No'); readln; end.
例5、求1992个1992的乘积的末两位数是多少?
解:积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求1992个92相乘,而且本次的乘积是下一次相乘的被乘数,因此也只需取末两位参与运算就可以了。 解法1:
program ex12; var i,n,s:integer; begin n:=92; s:=1;
for i:=1 to 1992 do s:=(s*n) mod 100; writeln(s); readln; end. 答案:36 解法2:
program ex313; var a,t:integer; Begin a:=1; t:=0; repeat t:=t+1;
a:=(a*92) mod 100; until t=1992; writeln(a); readln; End.
例6、猜价格:中央电视台的“幸运52”栏目深受观众喜爱,其中的“猜商品价格”的节目更是脍炙人口,现在请你编一个程序模拟这一游戏:由计算机随机产生200至5000之间的一个整数,作为某件商品的价格,然后由你去猜是多少,若你猜的数大了,则计算机输出提示“Gao”,若你猜的数小了,则计算机输出提示“Di”,然后你根据提示继续猜,直到你猜对了,计算机会提示“Ok”,并统计你猜的总次数。 随机函数:random介绍:random[?r?nd?m]随机 在pascal语言中提供了随机函数random(x),无自变量时,函数值取(0,1)间的随机小数;x为整数时,取(0,x)之间的随机整数;在调用随机函数之前,应使用randomize过程进行初始化,生成一个随机序列
调用random之前必须先调用没有参数的randomize,randomize[?r?nd?maiz],使随机化 begin
randomize;
writeln(random(100)); end.
random(x):随机产生一个0~x-1之间的整数
random(900)表示0~899之间的数,所以random(900)+100就是100~999 random(上界+1);产生0~上界 random(上界)+1;产生1~上界 random(上界);产生0~上界-1
random(上界)+下界;产生下界~上界+下界 random(上界-下界)+下界;产生下界~上界
解:本题的游戏规则大家都清楚,要完成程序,必须把处理步骤理清: (1)用随机函数Random产生200至5000之间的一个整数X; (2)你猜一个数A; (3)若A>X,则输出“Gao”; (4)若A<X,则输出“Di”; (5)若A=X则输出“Ok”; (6)重复(2)(3)(4)(5)直到A=X。
program ex315;
Var t,x,a:integer; begin
randomize;
x:= Random(4800)+200; t:= 0; repeat t:= t+1;
write('[',t,'] Qing cai yi ge zheng shu :'); readln(a);
if a>x then writeln('Gao'); if a 练习题: 1.求两个自然数M和N的最小公倍数。(如果求三个或更多个数的最小公倍数呢?应如何解决) program ex13; var a,b,n,s:integer; begin writeln('input a,b'); readln(a,b); n:=0; repeat n:=n+1; s:=a*n; until (s mod b=0) and (s mod a=0); writeln(s); readln; end. 2.小会议室里有几条相同的长凳,有若干人参加开会。如果每条凳子坐6人,结果有一条凳子只坐有3人;如果每条凳子坐5人,就有4人不得不站着。求会议室里有多少人开会,有多少条长凳? 这道题目显然是用枚举法,一开始我们通常会用到让人一个个增加,凳子也一根根增加,但我们会发现,按照1个人,1根凳子的数量关系去枚举,那永远也找不到凳子和人。因为,凳子和人的关系不是1根凳子1个人的数量。枚举的1个人,1根凳子;2个人,2根凳子 因此找对人和凳子的关系是关键。我们先考虑是让人一个个增加还是让凳子一根根增加,如果人1个个增加的话,凳子表达出来就不可能是整数了。因此我们选择让凳子一个个增加,那么,凳子一根跟增加,人按照怎样的数量关系增加呢?那么凳子和人有啥关系呢?从第一句话我们可以看出,凳子×6—人=3,因此我们可以找到,当凳子增加一根的时候,人应该是增加3个。人=凳子×6-3。如何从凳子×6—人=3,得到人=凳子×6-3,需要妈妈教你。这样我们就可以按照这个数量关系进行循环枚举凳子数和人数,直到符合题目意思:(dz*6-r=3) and (r-dz*5=4)就可以了。 解法1:program ex01; var r,dz:integer; begin dz:=0; repeat dz:=dz+1; r:=dz*6-3; until (dz*6-r=3) and (r-dz*5=4); writeln('r=',r,' ','dz=',dz); readln; end. 答案:39人,7根凳子。 当然,神捷捷的话,也可以直接根据盈亏问题,用算术方法做。但我们做这种题目的目的是为了掌握循环语句的用法。 4.某次同学聚会,老同学见面个个喜气洋洋,互相握手问好。参加此次聚会者每人都与老同学握了一次手,共握903次,试求参加聚会的人数? 解法1:用直到型循环。 首先我们先枚举一下2个人握1次,3个人握3次,4个人握6次,5人握10次,我们经过分析可以得出,人数为r的话,握手数等于1+2+3+..+(r-1),那么我们按照1+2+3这样循环来计算握手数,一直循环到握手数等于903,即可知道r-1的值,那么+1就等于总人数 因此编程: program ex01; var r,s,i:integer; begin s:=0; i:=0; repeat i:=i+1; s:=s+i; until s=903; r:=i+1; writeln(r); readln; end. 得到答案43人,后验算正确,说明算法正确。 方法二,在了解握手数等于握手数等于1+2+3+..加到总人数减1,我们可以大致推算出总人数在50以内,因此可以用for的方法解答。 program ex01; var r,s,i:integer; begin s:=0; for i:=1 to 50 do begin s:=s+i;
共分享92篇相关文档