[C/C++ 演算法]- 長 PI
剛才找資料時發現一個C/C++的教學網站,趕快發揮(C/P)的長才將它備份來,有需要的同好,歡迎來(C/P)一下^^。
拷貝來源:
http://openhome.cc/Gossip/AlgorithmGossip/
http://openhome.cc/Gossip/AlgorithmGossip/LongPI.htm
#include <stdio.h> #include <stdlib.h>
#define L 1000 #define N L / 4 + 1
// L 為位數,N是array長度
// 只處理正數的大整數加、減、除 void add(int*, int*, int*); void subtract(int*, int*, int*); void divide(int*, int, int*);
int main(void) { int s[N] = {0}; int w[N] = {0}; int v[N] = {0}; int q[N] = {0}; int n = (int) (L / 1.39793 + 1);
w[0] = 16 * 5; v[0] = 4 * 239;
int k; for(k = 1; k <= n; k++) { // 套用公式 divide(w, 25, w); divide(v, 57121, v); // 239 * 239 = 57121 subtract(w, v, q); divide(q, 2 * k - 1, q);
if(k % 2) {// 奇數項 add(s, q, s); } else { // 偶數項 subtract(s, q, s); } }
printf("%d.", s[0]); for(k = 1; k < N; k++) { printf("%04d", s[k]); } return 0; }
void add(int* a, int* b, int* c) { int i, carry = 0; for(i = N - 1; i >= 0; i--) { c[i] = a[i] + b[i] + carry; if(c[i] < 10000) { carry = 0; } else { // 進位 c[i] = c[i] - 10000; carry = 1; } } }
void subtract(int* a, int* b, int* c) { int i, borrow = 0; for(i = N - 1; i >= 0; i--) { c[i] = a[i] - b[i] - borrow; if(c[i] >= 0) { borrow = 0; } else { // 借位 c[i] = c[i] + 10000; borrow = 1; } } }
void divide(int* a, int b, int *c) { // b 為除數 int i, tmp, remain = 0; for(i = 0; i < N; i++) { tmp = a[i] + remain; c[i] = tmp / b; remain = (tmp % b) * 10000; } }
|
沒有留言:
張貼留言