1、第二节 repeat 循环Repeat 循环是直到型循环。试将上一节的例 3.1(打印出 120 的平方数表) 程序改为 repeat 循环:Program Exam31_1;Var a: byte;Begina:=1; writeln ( a : 8 , a*a : 8 ) ;repeatwriteln ( a :8,a*a : 8);inc(a); 改变 a 的值 Until a20;ReadlnEmd.程序中的 Repeat 循环格式为 :repeat循环体语句;until 条件表达式; 直到条件为真Repeat 循环首先执行由 Repeat 和 Until 括起来的循环体语句,然后检查
2、 Until 后面的条件表达式:如果表达式结果为假,则继续执行循环体,接着继续检查 Until 后面的条件表达式,如此反复执行直到这个表达式结果为真时结束循环。Repeat 循环体语句必须有能改变 Until 后面条件表达式值的语句,并最终使这个条件表达式的值为真,使循环自动结束。程序中 inc (a) 指令相当于 a : =a+1,常用的同类指令格式如下:(1) inc(x) 等同 x:=x+1;(2) inc(x, n) 等同 x:=x+n;(3) dec(x) 等同 x:=x1;(4) dec(x,n) 等同 x:=xn;例 3.10求两个自然数 M 和 N 的最大公约数。解:若自然数
3、a 既是 M 和约数,又是 N 的约数,则称 a 为 M 和 N 的公约数,其中最大的称为最大公约数。为了求得最大公约数,可以从最大可能的数(如 M 或 N)向下寻找,找到的第一个公约数即是最大公约数。Pascal 程序:Program ex310;Begina := N+1;Repeata := a-1;Until (M mod a=0) and (N mod a=0);writeln(a);Readln;End.例 3.11校体操队到操场集合,排成每行 2 人,最后多出 1 人 ;排成每行 3 人,也多出 1 人;分别按每行排4,5,6 人,都多出 1 人;当排成每行 7 人时,正好不多。
4、求校体操队至少是多少人?解:设校体操队为 X 人,根据题意 X 应是 7 的倍数,因此 X 的初值为 7,以后用 inc(x,7)改变 X 值;为了控制循环, 用逻辑变量 yes 为真(True) 使循环结束;如果诸条件中有一个不满足, yes 的值就会为假(false),就继续循环。Pascal 程序 :program Exam311;var x: word; yes : boolean;beginx:=0;repeatyes :=true; inc(x,7);if x mod 2 1 then yes:=false;if x mod 3 1 then yes:=false;if x mod
5、 4 1 then yes:=false;if x mod 5 1 then yes:=false;if x mod 6 1 then yes:=false;until yes; 直到 yes 的值为真 writeln(All =, x) ; readlnend.程序中对每个 X 值,都先给 Yes 赋真值,只有在循环体各句对 X 进行判断时,都得到“通过” (此处不赋假值)才能保持真值。例 3.12从键盘输入一个整数 X(X 不超过 10000) ,若 X 的各位数字之和为 7 的倍数,则打印“Yes ”,否则中打印“No” 。解:本题考察的是数字分离的方法,由于 X 的位数不定,所以以往的
6、解法不能奏效,这是介绍一种取余求商法。(1)用 X mod 10 分离出 X 的个位数字;(2)用 X div 10 将刚分离的个数数字删除,并将结果送回给 X;(3)重复(1) (2)直到 X 0。Pascal 程序:Program ex12;var x,a,s : integer;begins := 0;repeata := 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;例 3.13求 1992 个 1992 的乘积的末两位数是多少?解:
7、积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求 1992 个 92 相乘,而且本次的乘积主下一次相乘的被乘数,因此也只需取末两位参与运算就可以了。Pascal 程序:Program ex313;var a,t : integer;Begina := 1;t := 0;repeatt := t+1;a := (a*92) mod 100;until t=1992;writeln(a);Readln;End.例 3.14尼科彻斯定理:将任何一个正整数的立方写成一组相邻奇数之和。如: 3 3=7+9+11=27 43=13+15+17+19=64解:从举例中发现:(1) n3
8、 正好等于 n 个奇数之和;(2) n 个奇数中的最小奇数是从 1 开始的奇数序列中的第 m 个奇数,与 n 的关系为: m=n (n 1) / 2+1。(3) 奇数序列中第 m 个奇数的值为 x,且 x= 2m1,比如: n=3 时,m=3(3-1)/2+1=4,即 3 个奇数中最小的奇数是奇数序列中的第 4 个,它的值为 x=(2m-1)=7, 所以:33=7+9+11。(4) 从最小的奇数值 x 开始,逐个递增 2,连续 n 个,用 t 从 1 开始计数,直到 t=n 为止。Pascal 程序 :Program Exam35;Var n, m,x,t,s : integer;Beginw
9、rite(input n:); readln(n); 输入 N m:=(n*(n-1) div 2)+1; 找到第 m 个奇数 x:=2*m-1; t:=1; 算出第 m 个奇数的值 x,是所求的第一个write(n*,n, *,n, =,x) ;输出第一个s:=x; 用 S 计算和 if n1 thenRepeatinc(x,2); 计算下一个奇数 write (+ ,x) ; 加上下一个奇数 inc (t ); inc (s,x); 计个数并累加和 Until t=n; 直到 n 个 Writeln (= ,s ) ;ReadlnEnd.例 3.15猜价格:中央电视台的“幸运 52”栏目深
10、受观众喜爱,其中的 “猜商品价格”的节目更是脍炙人口,现在请你编一个程序模拟这一游戏:由计算机随机产生 200 至 5000 之间的一个整数,作为某件商品的价格,然后由你去猜是多少,若你猜的数大了,则计算机输出提示“Gao” ,若你猜的数小了,则计算机输出提示“Di” ,然后你根据提示继续猜,直到你猜对了,计算机会提示“Ok” ,并统计你猜的总次数。解:本题的游戏规则大家都清楚,要完成程序,必须把处理步骤理清:(1)用随机函数 Random 产生 200 至 5000 之间的一个整数 X;( 2)你猜一个数 A;( 3)若 AX,则输出“Gao ”;(4)若 AX,则输出“Di” ;(5)若
11、AX 则输出“Ok” ;(6)重复(2)(3)(4)(5)直到 A=X。Pascal 程序:Program ex315;Var t,X,a : integer;BeginRandomize;X := Random(4800)+200;t := 0;Repeatt := t+1;write(,t, Qing cai yi ge zheng shu : );readln(a);if ax then writeln(Gao);if ax then writeln(Di);if a=x then writeln(Ok);Until A=X;Readln;End.习题 3.21.求两个自然数 M 和 N
12、 的最小公倍数。 (如果求三个或更多个数的最小公倍数呢?应如何解决)2.小会议室里有几条相同的长凳,有若干人参加开会。如果每条凳子坐 6 人,结果有一条凳子只坐有 3 人;如果每条凳子坐 5 人,就有 4 人不得不站着。求会议室里有多少人开会,有多少条长凳?3.某动物饲养中心用 1700 元专款购买小狗(每只 31 元) 和小猫 (每只 21 元)两种小动物。要求专款专用,正好用完, 应当如何购买? 请输出所有方案。4.某整数 X 加上 100 就成为一个完全平方数 ,如果让 X 加上 168 就成为另一个完全平方数。求 X?5.某次同学聚会,老同学见面个个喜气洋洋,互相握手问好。参加此次聚会者每人都与老同学握了一次手,共握 903 次,试求参加聚会的人数?6.用自然数 300,262,205,167 分别除以某整数 A,所得到的余数均相同。求出整数以及相除的余数?7.1600 年前我国的一部经典数学著作中有题:“今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二,问物几何。 ”求最小解。8.编程求出所有不超过 1000 的数中,含有数字 3 的自然数,并统计总数。9.阿姆斯特朗数:如果一个正整数等于其各个数字的立方和,则该数称为阿姆斯特朗数(也称自恋数) ,如 4074 30 37 3,试编程求出 1000 以内的所有阿姆斯特朗数。