1、算法设计原理分析
利用周长为1的圆的周长为2Π,采用割圆术,从开始的正六边形(周长为6),循环切割求正12边形、正24边形……的边长(勾股定理),从而求出正多边形的周长,来近似求解出2Π的值。
整个算法采用循环,求解正多边形的边长à正多边形的周长à周长的一半。
2、程序设计
#include <stdio.h>
#include <math.h>
void pai(int n);
int main()
{
int n;
printf("Please enter the number of cuts:\nn = ");
scanf("%d",&n);
pai(n);
return 0;
}
void pai(int n)
{
int i=0,s=6; //i表示切割次数;s表示边数
double k=3.0,len=1.0,h=0; //k表示正多边形的周长,len表示正多边形的边长,h是求解边长时的中间变量
while(i<=n)
{
printf("The NO.%d cut is a regular %d sided shape,PI=%f\n",i,s,k);
h=1-sqrt(1-pow(len/2,2));
len=sqrt(pow(len/2,2)+pow(h,2));
i++;
s*=2;
k=s*len/2;
}
}
3、运行结果
4、算法分析(复杂度)
这是一个简单的单层循环算法,复杂度与切割次数n有关,所以复杂度为O(n)。
5、解题收获
通过对割圆术求圆周率算法的代码编写,回顾了割圆术的本质,其中的极限思想有助于算法学习、问题的解决。
萌新加入,欢迎各位作者交流!