一、源程序 本文分析下面這個很流行的計算PI的小程序。下面這個程序初看起來似乎摸不到頭腦,不過不用擔心,當你讀完本文的時候就能夠基本讀懂它了。 程序一:很牛的計算Pi的程序 int a=10000,b,c=2800,d,e,f[2801],g; main() { for(;b-c f[b++]=a/5; for(;d=0,g=c*2;c -=14,printf("%.4d",e+d/a),e=d%a) for(b=c; d+=f[b]*a,f[b]=d%--g,d/=g--,--b; d*=b); } 二、數學公式 數學家們研究了數不清的方法來計算PI,這個程序所用的公式如下: 1 2 3 k pi = 2 + --- * (2 + --- * (2 + --- * (2 + ... (2 + ---- * (2 + ... ))...))) 3 5 7 2k+1 至於這個公式為什麼能夠計算出PI,已經超出了本文的能力范圍。 下面要做的事情就是要分析清楚程序是如何實現這個公式的。 我們先來驗證一下這個公式: 程序二:Pi公式驗證程序 #include "stdio.h" void main() { float pi=2; int i; for(i=100;i>=1;i--) pi=pi*(float)i/(2*i+1)+2; printf("%f\n",pi); getchar(); } 上面這個程序的結果是3.141593。 三、程序展開 在正式分析程序之前,我們需要對程序一進行一下展開。我們可以看出程序一都是使用for循環來完成計算的,這樣做雖然可以使得程序短小,但是卻很難讀懂。根據for循環的運行順序,我們可以把它展開為如下while循環的程序: 程序三:for轉換為while之後的程序 int a=10000,b,c=2800,d,e,f[2801],g; main() { int i; for(i=0;i