零、介绍
题目要求:用集成化开发工具编写如下程序:采用割圆术计算圆周率,即对一个圆先割出一个正方形,再割出4个等腰三角形,再割出8个等腰三角形,后面依此类推,把这些割出的图形面积相加即为圆的面积,然后除以圆的半径的平方,最终得到圆周率。
这是博主第一段Java代码,写下此篇以纪念!
一、思路
分析:这里我们割的是圆的面积,分割成正n边形,然后求其面积之和。当n无穷大时,其面积之和等于圆的面积,也就是π*r*r。
本题的核心就是求多边形面积,多边形面积由以下两部分组成:
1.初始时中间的正方形面积S0;
2.每次割圆产生的n个三角形面积n*△S;
到这儿,大致的方法已经很明确了:定义S为总面积,初始值为正方形面积(S=S0)。每循环一次,S加上本次新增的n个三角形面积(S=S+n*△S);
如下图所示:
那么下面就是如何求那些三角形的面积(如下图粉红色部分)
首先分析正四边形,正方形:
我们知道,三角形最基本的面积公式为 面积 = 底 * 高;
如上图,设半径为r,粉红色三角形高为a,剩下那段为b。显然有r=a+b;
那么图中粉红色三角形面积 △S = 红色线段 * a;
即:;
由于r由我们给定,而a,b可以相互转化,所以△S其实由一个变量决定;
接着,分割一次,变成正八边形:粉红色为新的三角形
此时,本题最关键的地方来了,新三角形的边的两倍等于原来三角形的c边;
然后我们抓住这个关系,即可列出:
整理一下:
需要强调的是:这里的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计算三角形面积,但是这有个问题:这里用到了三角函数,而三角函数是基于圆的,其中的弧度制表示本身就是含有π的。而当时刘徽研究割圆术就是要求π呀,这样的话就有点拿着答案推过程的感觉了,所以像本题这样利用勾股定理来求三角形面积才是更符合常理,符合规律的方法!