[C/C++ 演算法]- 長 PI
[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;
}
}
|