分析问题
这个问题是一个利用循环迭代求解的过程。和之前讨论的累加求和类似,后一项的值是前一项的值+一个有规律可循的数,表示为s=s+i。只要我们分析出来需要加上的数据的规律这个题就有解了,我们来分析下规律(1) 每项的分子都是1。 (2) 后一项的分母是前一项的分母加2。 (3) 第1项的符号为正,从第2项起,每一项的符号与前一项的符号相反。
分析完成规律还要有一个结束循环的条件,这是求近似值,去们定一个循环结束条件i的绝对值是否大于或等于10-6,这里需要用到求绝对值的函数fabs(),需要在程序头部添加#include<math.h>头文件。
梳理思路
变量及初值: double s=0,i=1.0; int n=1,sign=1;
循环体
- s=s+i
- i:由符号、分子、分母组成,
- 符号:sign=-sign;
- 分子:1
- 分母:1、3、5、7、9......规律:n=n+2,2*n-1;
- i=sign*1.0/n;
循环条件:|i|绝对值小于10的-5次方 -----while(fabs(i)>=1e-5)
- 10的-5次方 用科学计数法的形式表示1e-5
- #include<math.h>
绘制流程图(变量做适当调整)
sign=1, pi=0, n=1, term=1 |
|
当 |term|≥10-6 |
|
pi=pi+term |
|
n=n+2 |
|
sign=-sign |
|
term=sign/n |
|
pi=pi*4 |
|
输出pi |
编写程序
#include<stdio.h>
#include<math.h>
int main()
{
int sign=1;
double item=1,pi=0,n=1;
while(fabs(item)>=1e-6)
{
pi=pi+item;
n=n+2;
sign=-sign;
item=sign/n;
}
pi=4*pi;
printf("pi=%f",pi);
return 0;
}
运行结果
思考
- 要提高pi的精度需要调整什么
- 你还能提出其他的解题方法吗?