某次碰到pi,想用程式設計列印出它的比較多的有效位(至少比背的要多)。
開始考慮到 pi/4 = arctan(1)
arctan(x)展成多項式 arctan(x) = (1/1!)x - (1/3)(x^3) + (1/5)(x^5) - ....
所以有 pi/4 = 1 - 1/3 + 1/5 - 1/7 + .....
但是上式後面的式子收斂太慢了,程式設計很難求到很多的有效位,
而後查到machin公式 pi/4 = 4arctan(1/5) - arctan(1/239),這個公式可以自己證明一下(忘的差不多了,塗了半天才算對)
這樣泰勒展開式收斂很快,我就是照著這個公式程式設計的,**如下
#include #include #include #define ks_min(a, b) ((a)
#define ks_max(a, b) ((a)>(b)?(a):(b))
#define bits 20000
typedef struct bigint
~bigint()
}bigint;
// out = in / x;
void division(bigint &out, bigint &in, int x)
for (i = out.l-1; i >= 0; i--)
out.l = i+1;
if (out.l == 0) out.l++;
}// a += b;
void addequal(bigint &a, bigint &b)
}for (i = a.l-1; i >= 0; i--)
a.l = i+1;
if (a.l == 0) a.l++;
}// a -= b;
void subequal(bigint &a, bigint &b)
}for (i = a.l-1; i >= 0; i--)
a.l = i+1;
if (a.l == 0) a.l++;
}// a *= k
void mulequal(bigint &a, int k)
}for (i = a.l-1; i >= 0; i--)
a.l = i+1;
if (a.l == 0) a.l++;
}void bigintcopy(bigint &dst, bigint &src)
void argtanx(bigint &out, int x, int digit)
}void print(bigint &a)
int main(int argc, char *argv)
///* pi/4 = 4*arctan(1/5) - arctan(1/239) */
設要算的有效位數為n,那麼上面時間複雜度大概o(n^2),所有10000位在幾秒鐘內應該能算出來
然後某次網上看到別人寫的**(稍微修改過)
#include #include #define bits 2000
int a=10000,b,c=bits*7/2,d,e,f[bits*7/2+1],g;
int main()
太簡短了!!!然後結果和我上面的對照過,是一致。
從**上看時間複雜度也是o(n^2),真實測時速度比我上面的**要快一些。
還好時間複雜度一致,不至於讓我過分自悲,然後看了半天也不明白它這個是用什麼原理設計的。
而後又查了一些pi的公式
拉馬努金公式
丘德諾夫斯基簡化版公式
等等,據說上面很多公式(如丘德諾夫斯基)計算pi很快,我其實不太理解怎麼處理那個根號。。。
pi的有效位已經到 萬億位級別
還有乙個bbp的關於pi的.....
好吧,我只能說我真的是過分渺小了。。。。。。
用python計算圓周率PI
向區域內隨即撒點 當點的數目足夠多時,落在圓的點數目與在正方形點數目成正比 即圓的面積和正方形的面積成正比 可以得出計算圓周率的演算法 darts 100000000 hits 0.0 clock fori inrange 1,darts 1 x,y random random dist sqrt ...
如何通過python計算圓周率PI
如下 def pi n pi 0 for k in range n pinforkrptb 程式設計客棧 1 pow 16,k 4 8 k 1 2 8 k 4 1 8 k 5 1 8 k 6 return pi import time scale 20 print 執行開始 center scale...
求圓周率pi的怪異程式 祖沖之圓周率演算法絕技之迷
據說華羅庚曾講過乙個故事,說 有個教書先生喜歡喝酒,一天,他叫學生背圓周率,自己卻提壺酒到山上廟裡找老和尚喝酒去了。有個聰明的學生把圓周率編了個 打油詩 山巔一寺一壺酒,爾樂苦煞吾,把酒吃 酒殺爾殺不死,樂爾樂 其實是 3.1415926535897932384626 的諧音。先生一回來,學生居然背...