【正文】
12個月,并且不死,問一年后,這對兔子有多少對活著的后代? 【 分析 】 根據(jù)題目給出的條件,得到算法:設(shè)當(dāng)前月兔子有 x對,它的前一個月有 lastx對,前二個月有 prevx對,明顯存在一個遞推關(guān)系,即 x=lastx+prevx。 Program ex4_5。 Var i,lastx,prevx,x : integer。 begin prevx : =1。 lastx : =2。 for i : =3 to 12 do begin x : =lastx+prevx。 prevx : =lastx。 lastx : =x。 end。 writeln(x)。 end. 運行結(jié)果: 233 例 一個兩位數(shù) x,將它的個位數(shù)字與十位數(shù)字對調(diào)后得到一個新數(shù) y,此時 y恰好比 x大 36,請編程求出所有這樣的兩位數(shù)。 【 分析 】 ① 用 for循環(huán)列舉出所有的兩位數(shù), x為循環(huán)變量; ② 用公式 a:= x div 10分離出 x的十位數(shù)字; ③ 用公式 b:= x mod 10分離出 x的個位數(shù)字; ④ 用公式 y:= b*10+a合成新數(shù) y; ⑤ 用式子 yx=36篩選出符合條件的數(shù) x并輸出。 Program ex4_6。 var a,b,x,y:integer。 begin for x := 10 to 99 do begin a := x div 10。 b := x mod 10。 y := b*10+a。 if yx=36 then writeln(x)。 end。 readln。 end. 例 把整數(shù) 3025從中剪開分為 30和 25兩個數(shù),此時再將這兩數(shù)之和平方, (30+25)2=3025計算結(jié)果又等于原數(shù)。求所有符合這樣條件的四位數(shù)。 【 分析 】 設(shè)符合條件的四位數(shù)為 N,它應(yīng)當(dāng)是一個完全平方數(shù),用 (a*a)表示。 ① 為了確保 N=(a*a)在四位數(shù)( 1000~ 9999)范圍內(nèi),可確定 a在 32~ 99循環(huán); ② 計算 N=a*a;將四位數(shù) N拆分為兩個數(shù) n1和 n2; ③ 若滿足條件 (n1+n2)*(n1+n2)= N 就輸出 N 。 Program ex4_8; Var n,a, x,n1,n2: integer; begin for a:=32 to 99 do begin n:=a*a; n1:= n div 100; //拆取四位數(shù)的前兩位數(shù) n2:= nn1*100; //拆取四位數(shù)的后兩位數(shù) x:=n1+n2; if x*x=N then writeln (N); end; readln end. 例 根據(jù)公式 π2/6=1+1/22+1/32+…+1/n 2,計算圓周率的 pai值。 【 分析 】 此題是上例的一個變例,關(guān)鍵在于求出右邊的累加和,變量 n由鍵盤輸入, n越大,圓周率的 pai值就越精確。但是, i作為循環(huán)控制變量參加循環(huán)體的運算,它是整型數(shù),那么當(dāng) i=182時, i*i已經(jīng)超過了正整數(shù) 32767的范圍,在 Pascal系統(tǒng)里就把它變?yōu)?65536+i*i的整型數(shù)進行處理,當(dāng) i=256時, 65536+i*i正好等于零,從面產(chǎn)生以零作除數(shù)的編譯錯誤,所以我們在程序里應(yīng)該把 i定義為長整型,這樣可以輸入更大的 n(不能大于 46341,等于 65536時,也會同樣出現(xiàn)被 0除的溢出錯誤 )。 Program ex4_9。 var i,n : integer。 //應(yīng)該為 longint(長整型 ) pai,s : real。 begin readln(n)。 s : =0。 for i : =1 to n do s : =s+1/(i*i) pai : =sqrt(6*s)。 writeln(pai : 8 : 6)。 end. 運行結(jié)果: 輸入: 1000 輸出: 輸入: 10000 輸出: 【 上機練習(xí) 】 求 12+22+32+…+1002 求 s=1+1/2+1/3+…+1/100 計算 100之內(nèi)所有的奇數(shù)之和。 計算 n!,其中 n由鍵盤輸入。 求 10個數(shù)中的最大值和最小值。 按字母表的順序,從字母 A到 Z順序打印輸出。 求菲波拉契數(shù)列 a0,a1,a2,……a 20。 a0=0, a1=1, a2=a1+a0, a3=a2+a1, …… , an=an1+an2;如 0,1,1,2,3,5,8,13,21,…… 第二節(jié) 當(dāng)語句( WHILE語句) WHILE循環(huán) 對于 for循環(huán)有時也稱為計數(shù)循環(huán),當(dāng)循環(huán)次數(shù)未知,只能根據(jù)某一條件來決定是否進行循環(huán)時,用 while 語句或 repeat語句實現(xiàn)循環(huán)要更方便。 while語句的形式為: while 布爾表達式 do 語句 ; 其意義為:當(dāng)布爾表達式的值為 true時,執(zhí)行 do后面的語句。 while語句的執(zhí)行過程為: ① 判斷布爾表達式的值 ,如果其值為真 ,執(zhí)行步驟 2,否則執(zhí)行步驟 4。 ② 執(zhí)行循環(huán)體語句 (do后面的語句 )。 ③ 返回步驟 1。 ④ 結(jié)束循環(huán) ,執(zhí)行 while的下一個語句。 說明: 這里 while和 do為保留字。 當(dāng)布爾表達式成立時,執(zhí)行 do后面的語句 (循環(huán)體 ),當(dāng)布爾表達式的值為false時,才結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行 while語句的下一條語句,故又稱此語句為“當(dāng)”語句或“當(dāng)型循環(huán)”。 while語句的特點是:先判斷,后執(zhí)行 。 例 求恰好使 s=1+1/2+1/3+…+1/n 的值大于 10時 n的值。 【 分析 】 恰好使 s的值大于 10意思是當(dāng)表達式 s的前 n1項的和小于或等于 10,而加上了第 n項后 s的值大于 10。從數(shù)學(xué)角度,我們很難計算這個 n的值。故從第一項開始,當(dāng) s的值小于或等于 10時,就繼續(xù)將下一項值累加起來。當(dāng) s的值超過 10時,最后一項的項數(shù)即為要求的 n。 程序如下 : Program ex4_10; Var s : real。 n : integer。 //n表示項數(shù) begin s : =。 n : =0。 while s=10 do //當(dāng) s的值還未超過 10時 begin n : =n+1。 //項數(shù)加 1 s : =s+1/n。 //將下一項值累加到 s end。 writlen(39。n=39。,n)。