C语言 求π的近似值
愉快的一天,不得不做的三件事:
种田,锄地,整代码!!!
【题目】
用循环方法实现。
(1)请利用“正多边形逼近”的方法求出π的近似值。
(2)利用随机数法求π的近似值。
【设计思路】
(1)“正多边形逼近”的方法思路:
利用圆内接正六边形边长等于半径的特点将边数翻番,作出正十二边形,求出边长,重复这一过程,就可获得所需精度的π的近似值。
(2)随机数法求π的近似值的思路:
在一个单位边长的正方形中,以边长为半径,以一个顶点为圆心,在正方形上作四分之一圆。
随机的向正方形内扔点,若落入四分之一圆内则计数。
重复向正方形内扔足够多的点,将落入四分之一圆内的计数除以总的点数,其值就是π值四分之一的近似值。
该方法求出的π值只有统计次数足够多时才可能准确。
【代码分析】
double b,d,b0;
/*b为多边形边长,d为圆半径与三角形中线之差*/
long i;
/*内接多边形的边数*/
for(i=6,b=0.5;;i*=2)
/*首先单位圆内接正六边形,初始b等于半径的一半,即为0.5;每次循环,内接多边形边数翻一倍*/
{
b0=b;
/*保存本次正多边形的边长作为精确度控制的依据*/
d=1-sqrt(1-b*b);
b=sqrt(b*b+d*d)/2;
if(2*b*i-b0*i<1e-15)
break;
/*精确度达到1e-15时,跳出循环*/
}
printf("方法一得到:π=%.15lf\n",2*i*b);
long i;
double x,y,k,PI;
srand((unsigned)time(NULL));
/*srand()函数用来设置算法的种子,time(NULL)返回当前的时间,先调用srand(time(NULL)),把当前的时间作为种子,使程序每次运行产生不同的随机数*/
for(i=0,k=0;i<N;i++)
{
x = rand() / (double)RAND_MAX;
y = rand() / (double)RAND_MAX;
/*RAND_MAX 是 <stdlib.h> 中伪随机数生成函数 rand 所能返回的最大数值,此时得到一个 0~1.0 之间的随机浮点数*/
if (sqrt((x - 0.5)*(x - 0.5) + (y - 0.5)*(y - 0.5)) <= 0.5)
k++;
/*记录落入四分之一圆的点数*/
}
PI=4*k/N;
printf("方法二得到:π=%.15f\n",PI);
【代码展示】
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#define N 1e6
void main1()
{
double b,d,b0;
long i;
for(i=6,b=0.5;;i*=2)
{
b0=b;
d=1-sqrt(1-b*b);
b=sqrt(b*b+d*d)/2;
if(2*b*i-b0*i<1e-15)
break;
}
printf("方法一得到:π=%.15lf\n",2*i*b);
}
void main2()
{
long i;
double x,y,k,PI;
srand((unsigned)time(NULL));
for(i=0,k=0;i<N;i++)
{
x = rand() / (double)RAND_MAX;
y = rand() / (double)RAND_MAX;
if (sqrt((x - 0.5)*(x - 0.5) + (y - 0.5)*(y - 0.5)) <= 0.5)
k++;
}
PI=4*k/N;
printf("方法二得到:π=%.15f\n",PI);
}
void approximation()
{
printf("-------欢迎进入<求π的近似值>操作界面-------\n\n");
main1();
main2();
}
int main()
{
approximation();
return 0;
}
【运行结果展示】
IT 农工要回家休息了,我们下期再见吧
记得点击“在看”进行收藏哦
往期精彩