1、while语句的格式
使用for语句编写程序时通常须要事先知道循环次数,若是遇到不能肯定循环次数的问题时可使用while语句。while语句用于“当知足某一条件时进行循环”的状况。
while语句的格式:while 布尔表达式 do 语句;
while语句的执行过程是:先求布尔表达式的值,当其值是真时,进入循环执行do后面的语句;而后返回再求布尔表达式的值,若布尔表达式的值是真,再次执行do后面的语句;若是布尔表达式的值是假就退出循环,执行while下面的语句。
注意事项:
一、为了使while循环正常终止,在循环体内必定要有改变布尔表达式值的语句,以使布尔值有可能为假,从而结束循环;不然将会致使循环没法结束的“死循环”状态。
二、循环体是多个语句时,需用begin和end将它们括起来造成一条复合语句。
三、若是循环开始时,布尔表达式就为假,则不执行循环体,直接退出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.
2、做业
一、zerojudge:
基础题:a02四、a03八、a12一、a14七、a14九、a73八、d070、d35六、d69三、d899
思考题:a21五、a30七、b330、c07九、d25五、d593
二、利用公式π/4=1-1/3+1/5-1/7+……,求π的值,要求精确到最后一项小于0.0001为止。
三、打印输出一百到一亿之间的,既是彻底平方数又是回文数的全部正整数(彻底平方数是一个正整数的平方数,回文数即为左右对称的正整数)。例如:121,它是11的平方,也是左右对称的天然数。
四、输入两个正整数,求这两个正整数的最小公倍数。(设这两个数分别是m和n,另设一个整型变量i,则m*i就是m的i倍。令i向n变化,每次增长1,在此过程当中,当m*i能被n整除时,m*i即为所求。)