計算圓周率的C語言程式
#include
#define L 10000 //求10000位PI值
#define N L/4+1
// L 為位數,N是array長度
/*圓周率後的小數位數是無止境的,如何使用電腦來計算這無止境的小數是一些數學家與程式設計師所感興趣的,在這邊介紹一個公式配合 大數運算,可以計算指定位數的圓周率。
John Wallis的圓周率公式:
//詳細看網站介紹:https://baike。baidu。com/item/%E5%9C%86%E5%91%A8%E7%8E%87/139930?fr=aladdin
PI = [16/5 - 16 / (3*53) + 16 / (5*55) - 16 / (7*57) + ……] - [4/239 - 4/(3*2393) + 4/(5*2395) - 4/(7*2397) + ……]
*/
void add ( int*, int*, int* );
void sub ( int*, int*, int* );
void div ( int*, int, int* );
int main ( void )
{
int s[N+3] = {0};
int w[N+3] = {0};
int v[N+3] = {0};
int q[N+3] = {0};
int n = ( int ) ( L/1。39793 + 1 );
int k;
w[0] = 16*5;
v[0] = 4*239;
for ( k = 1; k <= n; k++ )
{
// 套用公式
div ( w, 25, w );
div ( v, 239, v );
div ( v, 239, v );
sub ( w, v, q );
div ( q, 2*k-1, q );
if ( k%2 ) // 奇數項
add ( s, q, s );
else // 偶數項
sub ( s, q, s );
}
printf ( “%d。”, s[0] );
for ( k = 1; k < N; k++ )
printf ( “%04d”, s[k] );
printf ( “\n” );
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 sub ( 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 div ( int *a, int b, int *c ) // b 為除數
{
int i, tmp, remain = 0;
for ( i = 0; i <= N+1; i++ )
{
tmp = a[i] + remain;
c[i] = tmp / b;
remain = ( tmp % b ) * 10000;
}
}
仁兄你好強大, 用割圓法求圓周率, 你厲害,我還不知道怎麼使用割圓法呢, 更別說 讓我用程式來實現, 我只知道 我們求圓周率 用的是 “直徑 除以 周長 ” 割圓法, 祖沖之的, 我還真的 不曉得是怎麼個割法
沒有問題啊,只是你的迴圈次數太少,所以計算出來的數值不正確
n=1000時 pre=3。140024
n=10000時pre=3。141436
n=100000時pre=3。141577
n=1000000時pre=3。141591
迴圈次數越多計算精度越高
1000次就能算出3。14了