根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
错误代码:
#include <iostream>
using namespace std;
int main()
{
double pai = 0;
double x;//作为阀值
cin>>x;
int i=1;
double project;
// int j=1;
int product = 1;//两个int类型相除是不会有结果的
int product2 = 1;
while(true)
{
product = product*i;
product2 = product2*(2*(i-1)+1);
project = product/product2;
if(project<x)
{
break;
}
pai += project;
i++;
}
printf("%lf",pai);
}
问题分析:
- 将product,product2全部声明为int型,这是错误的,当两者相除小于1时,赋值给project的值为0
- 注意题目的公式是π/2,所以结果还需要×2
- 仍然没有看清公式,公式分子的第一项是0!,第二项是1!,而代码中第二项处理成2!
修改
针对以上问题我对代码进行了修正
#include <iostream>
using namespace std;
int main()
{
double pai = 0;
double x;//作为阀值
cin>>x;
int i=0;
double project;
// int j=1;
double product = 1;
int product2 = 1;
while(true)
{
product = product*i;
if(i==0)
{
product = 1;
}
product2 = product2*(2*i+1);
project = product/product2;
pai += project;
if(project<x)
{
break;
}
// pai += project;
i++;
}
printf("%lf",pai*2);
}
这里需要注意两个问题:
- 当项小于阈值时,该项仍然需要相加
- 提交时,会直接提示直接计算n!会超长整型,说明系统不希望直接计算n!,可以将分子和分母之商作为一个变量,将此变量累加
正确代码:
#include <iostream>
using namespace std;
int main()
{
double pai = 0;
double x;//作为阀值
cin>>x;
int i=0;
// double project = 1;
// int j=1;
double n = 1;
while(n>=x)
{
n = n*i/(2*i+1);
//pai += n*i/(2*i+1);
if(i==0)
{
n = 1;
}
pai += n;
i++;
}
printf("%.6lf",pai*2);
}
总结:
- 程序员不需要视力.jpg
- 当结果为小数时,声明变量类型不能盲目int
- 当需要间接计算很大的数时,直接将结果作为一项