今天看到hdu上有一题是要计算圆周率,查阅了一些资料,发现有这些方法:
1.正方形逼近;
2.迭代法;
3.蒙特卡罗法;
4.丘德诺夫斯基公式
$蒙特卡洛法
蒙特卡罗法是生成N多个随机坐标落在1×1的方格里,统计x平方+y平方<1的个数的点即可。
如何用蒙特卡罗方法计算圆周率π呢
正方形内部有一个相切的圆,它们的面积之比是π/4。
现在,在这个正方形内部,随机产生10000个点(即10000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。
如果这些点均匀分布,那么圆内的点应该占到所有点的 π/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<stdio.h>
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上的那题 (逃