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即爲所求。)