计算PI(π)的方法


今天看到hdu上有一题是要计算圆周率,查阅了一些资料,发现有这些方法:

1.正方形逼近;

2.迭代法;

3.蒙特卡罗法;

4.丘德诺夫斯基公式

 

$蒙特卡洛法

蒙特卡罗法是生成N多个随机坐标落在1×1的方格里,统计x平方+y平方<1的个数的点即可。

 

如何用蒙特卡罗方法计算圆周率π呢

正方形内部有一个相切的圆,它们的面积之比是π/4。

计算PI(π)的方法_第1张图片

现在,在这个正方形内部,随机产生10000个点(即10000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。

计算PI(π)的方法_第2张图片

如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。通过随机模拟30000个点,π的估算值与真实值相差0.07%。

 

 

 

 

$丘德诺夫斯基公式

 

 

 

然后重点来了:

这是1988年的IOCCC大赛上计算圆周率的代码:

 

 

#define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_
}

用一段形状是圆形的程序,通过计算代码本身的面积,计算圆周率的近似值

 

 

 

 

之后我又发现一种超级简洁而且收敛很快的算法

按照这个思路写了下代码:
 

 

#include
long a=10000, b, c=28000, d, e, f[28001], g;
long ans[28001];

int func ()
{
     int num=1;
     for(;b-c;)
        f[b++]=a/5;
     for(;d=0,g=c*2;c-=14,ans[num++]=(e+d/a),e=d%a)
     for(b=c; d+=f[b]*a, f[b]=d%--g, d/=g--, --b; d*=b);
}



int main ()
{
    int n;
    func();
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=1;i<=n;i++)
            printf("%.4d",ans[i]);


    }
    return 0;
}


注意的是每个ans[i]中保存的是4位数;

 

最后,看了一大堆,我果断的用打表来水过了hdu上的那题  (逃

你可能感兴趣的:(算法)