題目雖說用loop解決,不過要用loop前也得先生出規律。
以下小弟的簡單解答,建議自己想過後,真的想不出來再看~
I.找規律
要用loop前,不管是for、while、do-while都要先找到規律才行。
這邊簡單說我找到的規律。
如果將上面那一連串相乘的東西,兩項兩項的看可以推出一個通式
4k^2 / (2k+1)(2k-1)
找到規律後計算就很簡單了
假設用"r"這個變數儲存結果,可以寫成
r=r*pow((double)k,2)*4/(2*k+1)/(2*k-1);
這邊說明一下,因為要計算的是圓周率,要宣告為float或者double,而這邊我為了精準度選double。
另外,pow這個函數有兩點要注意。
1.Header file一定要寫下
另外,pow這個函數有兩點要注意。
1.Header file一定要寫下
#include <math.h>
才能使用喔
2.pow運算的對象要是float或double所以要記得加上(double)強制將k轉型
2.pow運算的對象要是float或double所以要記得加上(double)強制將k轉型
II.應用無限迴圈(infinite loop)
題目規定要利用for,而for無限迴圈是這麼寫的
for(;;) { }
III.設定結束條件
這邊讓迴圈結束的條件要利用一點double和float的特性。
這兩種資料型態都存在著精準度問題,當小數部分超過記憶體所能儲存的位數時,便會被捨棄掉。
而我們停止的條件就是當計算到第N項和第N+1項結果相同時,就跳出迴圈。
於是在迴圈中寫下:
temp=r;//計算前先把前一次的結果暫存起來
和
if(r==temp) break; //檢查,若與前一次答案相同就跳出迴圈
注意這兩行必須分別放在計算式的前後,像是這樣
temp=r;//計算前先把前一次的結果暫存起來 r=r*pow((double)k,2)*4/(2*k+1)/(2*k-1); //計算 if(r==temp) break; //檢查,若與前一次答案相同就跳出迴圈
IV.程式碼參考
#include <stdio.h> #include <stdlib.h> #include <math.h> void main(void) { //宣告要用的變數 int k=1; double r=1,temp; for(;;) //製造無窮迴圈 { temp=r;//計算前先把前一次的結果暫存起來 r=r*pow((double)k,2)*4/(2*k+1)/(2*k-1); //計算 if(r==temp) break; //檢查,若與前一次答案相同就跳出迴圈 k++; //每執行1次,k就+1 } printf("pi = %.4f\n",2*r); }
沒有留言:
張貼留言