割圆术求圆周率

零、介绍

题目要求:用集成化开发工具编写如下程序:采用割圆术计算圆周率,即对一个圆先割出一个正方形,再割出4个等腰三角形,再割出8个等腰三角形,后面依此类推,把这些割出的图形面积相加即为圆的面积,然后除以圆的半径的平方,最终得到圆周率。

这是博主第一段Java代码,写下此篇以纪念!

一、思路

分析:这里我们割的是圆的面积,分割成正n边形,然后求其面积之和。当n无穷大时,其面积之和等于圆的面积,也就是π*r*r。

本题的核心就是求多边形面积,多边形面积由以下两部分组成:

1.初始时中间的正方形面积S0;

2.每次割圆产生的n个三角形面积n*△S;

到这儿,大致的方法已经很明确了:定义S为总面积,初始值为正方形面积(S=S0)。每循环一次,S加上本次新增的n个三角形面积(S=S+n*△S);

如下图所示:

割圆术求圆周率_第1张图片

 

那么下面就是如何求那些三角形的面积(如下图粉红色部分)

割圆术求圆周率_第2张图片

首先分析正四边形,正方形:

我们知道,三角形最基本的面积公式为 面积 = 底 * 高;

如上图,设半径为r,粉红色三角形高为a,剩下那段为b。显然有r=a+b;

那么图中粉红色三角形面积 △S = 红色线段 * a;

即:\Delta S=\sqrt{r^{2}-b^{2}} \times a;       

由于r由我们给定,而a,b可以相互转化,所以△S其实由一个变量决定;

接着,分割一次,变成正八边形:粉红色为新的三角形

割圆术求圆周率_第3张图片

 

 

 

此时,本题最关键的地方来了,新三角形的\sqrt{r^{2}-b^{2}}边的两倍等于原来三角形的c边

 

然后我们抓住这个关系,即可列出:\sqrt{r^{2}-b^{2}} \times 2= c

整理一下:b= \sqrt{r^{2}-\frac{c^{2}}{4}}

需要强调的是:这里的b是新三角形的b边,c是原来的三角形的c边;相当于是利用原来的c边对b边进行了更新。这样一来,b边表示的就是下一个三角形的b边了。再结合刚才△S的公式,就可以求出新的三角形的面积了。

算出来S后,不要忘记乘以三角形个数n。

二、代码

直接上代码及注释

public class sy1_3 
{
    public static void main(String args[])
    {
    	int n;			//内接正n边型
    	double r=1.0;	//半径
    	double a,b,c;	//中间变量
		double s,Δs;   //总面积,面积增量
		double π;
		
		s=2*r/Math.sqrt(2)*2*r/Math.sqrt(2);	//赋初值,正方形面积
		b=r/Math.sqrt(2);						//初始化b边的值
		
		for(n=4;n<=10000;n=n*2)	//此时内接的是正n边型
		{
			a=r-b;							//计算a边值
			c=Math.sqrt(a*a-b*b+r*r);		//计算c边值
			Δs=n * a*Math.sqrt(r*r-b*b);   //求面积增量
			s=s+Δs;						   //面积累加
			b=Math.sqrt(r*r-c*c/4);			/****利用原来的c边更新b边****/
		}
		π=s/r/r;						   //计算π
		System.out.println("到内接正"+n+"边型时:");
		System.out.print("π="+π);
    }
}

三、其他

 在刚拿到题目的时候,我的思路是利用S=1/2*a*b*sinC计算三角形面积,但是这有个问题:这里用到了三角函数,而三角函数是基于圆的,其中的弧度制表示本身就是含有π的。而当时刘徽研究割圆术就是要求π呀,这样的话就有点拿着答案推过程的感觉了,所以像本题这样利用勾股定理来求三角形面积才是更符合常理,符合规律的方法!

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