因为圆面积s=pi*r^2,
创新互联长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为通江企业提供专业的成都做网站、网站设计、外贸营销网站建设,通江网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
所以pi=s/r^2.
点(x,y)是0~1正方形范围内的随机点,如果x^2+y^2=1,则该点在单位圆内.
x^2+y^2就是r^2,即圆半径的平方.d/N为点x,y落入单位圆内的概率,即约为圆面积.
圆的半径为1/2,而不是1,所以pi=4*d/N.
#include stdio.h
double fact(int n)
{
double res = 1.0;
for(int i = 1; i = n; i++)
res *= i;
return res;
}
double multi(int n)
{
double res = 1.0;
for(int i = 1; i = n; i += 2)
res *= i;
return res;
}
int main()
{
double sum=1.0, item=1.0, eps = 1e-6;
for(int i = 1; item = eps; i++)
{
item = fact(i) / multi(2*i + 1);
sum = sum + item;
}
printf("PI=%0.5lf\n", sum * 2);
return 0;
}
//这样可以得到3.14159
在for循环后加一句: sum -= f;
你多加了最后那个小于epsioon的值。
#include stdio.h
int main()
{
float f;
double pi,i,sign;
while(scanf("%f",f)==1)
{
pi=0;
i=1;
sign=1;
do
{
pi+=sign*1.0/i;
}while(1.0/i=f(sign=-sign)(i+=2));
printf("%lf\n",pi*4.0);
}
return 0;
}
#include stdio.h
#define L 10000 //求10000位PI值
#define N L/4+1
// L 为位数,N是array长度
/*圆周率后的小数位数是无止境的,如何使用电脑来计算这无止境的小数是一些数学家与程式设计师所感兴趣的,在这边介绍一个公式配合 大数运算,可以计算指定位数的圆周率。
John Wallis的圆周率公式:
//详细看网站介绍:
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;
}
}