一、while语句的格式
使用for语句编写程序时一般需要事先知道循环次数,如果遇到不能确定循环次数的问题时可以使用while语句。while语句用于“当满足某一条件时进行循环”的情况。
while语句的格式:while 布尔表达式 do 语句;
while语句的执行过程是:先求布尔表达式的值,当其值是真时,进入循环执行do后面的语句;然后返回再求布尔表达式的值,若布尔表达式的值是真,再次执行do后面的语句;如果布尔表达式的值是假就退出循环,执行while下面的语句。
注意事项:
1、为了使while循环正常终止,在循环体内一定要有改变布尔表达式值的语句,以使布尔值有可能为假,从而结束循环;否则将会导致循环无法结束的“死循环”状态。
2、循环体是多个语句时,需用begin和end将它们括起来形成一条复合语句。
3、如果循环开始时,布尔表达式就为假,则不执行循环体,直接退出while语句。
例1:有一张纸,其厚度为0.1毫米,将它对折多少次,其厚度将超过珠穆朗玛峰的高度。
var
i:byte;
r:real;
begin
i:=0;
r:=0.0001;
while r<8848 do begin
r:=r*2;
i:=i+1;
end;
writeln(i);
end.
例2:输入一个正整数,求这个正整数的各位数字之和。
var
n,ans:integer;
begin
readln(n);
ans:=0;
while n>0 do begin
ans:=ans+n mod 10;
n:=n div 10;
end;
writeln(ans);
end.
例3:输入一个正整数,将这个正整数的各位数字逆序输出。
var
n:integer;
begin
readln(n);
while n>0 do begin
write(n mod 10);
n:=n div 10;
end;
end.
思考:如何优化,使得输入120,输出21。
例4:输入两个正整数,求这两个正整数的最大公约数。
分析:采用辗转相除法求m和n的最大公约数,即:设m=n+r(0<=r<n),则m和n的最大公约数与n和r的最大公约数相同,当r等于0,这时的n就是m和n的最大公约数。若r不等于0,再对n和r重复上面过程,直到r=0为止。
例如:求231和63的最大公约数
231 mod 63=42
63 mod 42=21
42 mod 21=0
所以42和21的最大公约数为21,由此得出231和63的最大公约数也为21。
var
a,b,c:integer;
begin
readln(a,b);
while b>0 do begin
c:=a mod b;
a:=b;
b:=c;
end;
writeln(a);
end.
思考:你会求两个数的最小公倍数吗?
例5:输入一个大于1的自然数N,将N分解成质因数的乘积。
例如:
N=120
120=2*2*2*3*5
var
n,i:integer;
f:boolean;
begin
readln(n);
write(n,'=');
f:=false;
i:=2;
while n>=i do begin
while n mod i=0 do begin
if f then write('*') else f:=true;
write(i);
n:=n div i;
end;
i:=i+1;
end;
end.
例6:求2到1000之间的素数,一行打印十个素数。
var
i,k:integer;
prime:boolean;
begin
for i:=2 to 1000 do begin
prime:=true;
k:=2;
while (k<=trunc(sqrt(i))) and prime do begin
if i mod k=0 then prime:=false;
k:=k+1;
end;
if prime then write(i:8);
end;
end.
二、作业
1、zerojudge:
基础题:a024、a038、a121、a147、a149、a738、d070、d356、d693、d899
思考题:a215、a307、b330、c079、d255、d593
2、利用公式π/4=1-1/3+1/5-1/7+……,求π的值,要求精确到最后一项小于0.0001为止。
3、打印输出一百到一亿之间的,既是完全平方数又是回文数的所有正整数(完全平方数是一个正整数的平方数,回文数即为左右对称的正整数)。例如:121,它是11的平方,也是左右对称的自然数。
4、输入两个正整数,求这两个正整数的最小公倍数。(设这两个数分别是m和n,另设一个整型变量i,则m*i就是m的i倍。令i向n变化,每次增加1,在此过程中,当m*i能被n整除时,m*i即为所求。)