您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
021第五章 循环控制结构程序06-小学就学过的圆周率你就真的了解吗?
发布时间:2021-04-18 18:03:11编辑:雪饮阅读()
例题:把100~200之间的不能被3整除的数输出。
这个题目其实很好做,因为能被3整除的数,那么余数必定为0,所以具体的实现如:
#include <stdio.h>
void main()
{
int n;
for (n=100;n<=200;n++)
{
if (n%3==0){
continue;
}
printf("%d\n",n);
}
}
解决从其它地方复制的代码无法编译通过问题
其实这个在前面就已经介绍了,但是留下了一个彩蛋,那个我没有自己亲自测试在记事本上处理,那么今天从网上拷贝过来的代码,感觉不对劲,这直接拷贝到记事本上面就可以看到这些方框型的地方,这些就是不兼容的地方,那么只需要把这些地方处理掉即可。这样就可以比之前那种处理方式更快了,不用按模糊的行列来处理了,因为编译器一般提示的错误都是有误差的
程序举例
NO.ONE:
用π/4 ≈ 1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于目标精度为止。
即从1开始每次减少一个分数然后再加上一个比这个分数小的分数,那么这样下去就会数值越来越小,因为每次减少的值都比加上的值多。
那么这个题目就是我们要根据一个目标精度来计算圆周率。
话说这小学就学的圆周率,那么你真的就了解它吗?
其实这里这个公式还可以转换成这样的。
π/4 ≈ 1/1-1/3+1/5-1/7+…
π/4 ≈ 1/1+(-1/3)+(1/5)+(-1/7)+…
程序提示:1.要确定计算的精度……
那么如何确定这个目标精度呢?根据公式我们可以发现精度越大,最后的分母将会越大,所以说,那么结合我们转换后的最终公式不难发现,我们的目标精度就是某次+号后面的分数值,那么经过再次观察转换后的最终公式不难发现每次的分数值总是再正负间进行切换,所以我们可以取该精度的绝对值,然后做为循环结束的条件。
那么接下来我们就要确定具体的算法了,根据转换的最终公式不难发现每次分子不变,分母每次增加2。
那么这个算法实现后,只是算的结果是π/4,所以最后的最后要记得结果乘以4哦
那么我们的具体实现就如:
#include <stdio.h>
#include<math.h>
void main(){
int s;
float n,t,pi;
//首次分数值
t=1;
//未来用于存储Π的计算结果
pi=0;
//首次分母值
n=1.0;
//初始分子
s=1;
//这里要确定的精度:0.000001,C语言fabs()函数:求双精度浮点数的绝对值
while( fabs(t) > 1e-6 )
{
printf("t=%10.6f\n",t);
pi = pi+t;
n = n+2;
s = -s;
t = s/n;
}
pi = pi*4;
//总共10位,保留6位小数
printf("pi=%10.6f\n",pi);
}
这里的编译及运行结果,就只显示一部分了,因为循环结果太多了
t= 0.000001
t= -0.000001
t= 0.000001
t= -0.000001
t= 0.000001
t= -0.000001
t= 0.000001
t= -0.000001
t= 0.000001
t= -0.000001
t= 0.000001
t= -0.000001
pi= 3.141594
这里可能大家还有一个问题,就是fabs接收的参数类型是double即双精度,那么我给它传单精度float,会不会有问题,其实double范围比float大,完全没有问题,倒是反过来的话反而会丢失精度。不过这里我个人建议还是全部用double比较好。这里这样写,也是因为受小甲鱼的影响。。。
关键字词:c,圆周率