2013年9月19日 星期四

[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;
}
}


 


沒有留言:

張貼留言