153
社区成员
发帖
与我相关
我的任务
分享有一分数序列:2/1 3/2 5/3 8/5 13/8 21/13……,试编写程序计算此分数序列的前n项之和。
输入正整数n。
输出前n项之和,保留6位小数。
输入
5
输出
8.391667
#include <iostream>
#include<math.h>
#include<iomanip>//保留小数必要头文件
using namespace std;
int main()
{
double sum=0.0;
int n,a=2,b=1,t;
cin>>n;
for(int i=0; i<n; i++)
{
sum=sum+(double)a/b;
t=a;
a=a+b;
b=t;
}
cout<<setiosflags(ios::fixed)<<setprecision(6)<<sum<<endl;
}
思路:1.定义分子为a=2,分母位b=1;
2.后边相加时每一位的规律就是 分子=前一位的分子分母之和;
分母=前一位的分子;。。。。。。。。。。以此类推
3.本题有一个特殊之处就是当 double a=2.0,b=1.0 时进行计算时,输出的前边的数字是没有问题正确的,但是系统提示当n=79时,答案就错
误了,而前边正确后边有问题说明代码思路没问题,问题出在细节上,这里运用到了int a,b;把a/b强制转换成double型即double(a/b)即可解
决问题。
*在做除法运算时,分子分母都是int类型,要求化成小数形式,这时就需要强制类型转换。要注意的时,当从int转化为double类型时,会提高精度,而从double转化为Int时会降低精度,这是由于int类型占4字节,而double占8字节导致的。
思路清晰,描述详细,题目考点解决方案详细,加油!