割圆术计算圆周率
“割圆术”是我国数学家刘徽创立的一种求圆周率的方法。思想是当圆的内
接正多边形的边数无限大时内接正多边形的面积就无限趋近于圆的面积,即所
谓 “割之弥细,所失弥少,割之又割,以至于不可割,则与圆周合体无所失
矣”。
“割圆术”理论上能把π的精度计算到任意精度。现在我们利用计算机能够
自动的完成这个过程。我们先来分析一下圆的内接正六边形、正十二边形、正
二十四边形······的面积之间的关系,寻求它们的递增规律。
hn xn sn
如图,设圆的半径为1,弦心距为 ;正n边形的边长为 ,面积为 。由
2 2
xn xn 2
x2n( (1hn)
勾股定理,得hn 1( ) , 2) ,(n≥6)。
2
O是原点、hn是弦
心距、xn是正n边形
的边长、x2n是正2n
边形的边长
不难发现,正2n边形的面积等于正n边形的面积加上n个等腰三角形的面
1
积,即s2nsnn xn(1hn),(n6) 。利用这个递推公式和n=6时的面积、弦心
2
距就能不断循环得到一个比较接近圆的面积的值。因为圆的半径是1,所以面
积为π,那么正2n边形的极限值即为π的值。
现在我们用c语言来计算该近似值,利用初值和递推关系来循环计算。
由于用到了sqrt ()这个数学函数,所以要包含math.h这个头文件。程序结
果的输出利用了printf()这个函数,所以要包含printf()所在的头文件,即
Stdio.h。
我使用的编译器为gcc IDE为Dev c++,下面是示例代码
#include
#include
int main()
{
long int n;/*定义内接正多边形的边数*/
double h,x,s;/*h是弦心距,x是边长,s是面积*/
for(n=6,x=1,s=3*sqrt(3)/2;n<=5999;n+=n)/*n 的初值为
6,此时设x 的值就是单位圆的半径1,
s的值为正六边形
的面积 n每次循环后加一倍 */
{
h=sqrt(1-x*x/4);//算2n边形的弦心距
s+=n*x*(1-h)/2;//算2n边形的面积
x=sqrt((x*x)/4+(1-h)*(1-h));//算2n边形的边长
}
printf("%.9f",s);
return 0;
}
运行结果如下
本文完工与-02-13 01:20 我的第一篇算法说明文档。处女作
啊!希望以后保持这个节奏,每天写写研究算法的心得和收获,记录自己的一
些进步。