2013年4月19日 星期五

[C]Book page 217 Problem 3

這題其實也滿煩的....
題目雖說用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一定要寫下
#include <math.h>
才能使用喔
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);
}

沒有留言:

張貼留言