c语言再次提问

有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, …编写程序求出这个序列的前n项之和。
输入
输入只有一个正整数n,1≤n≤10。
输出
输出改序列前n项和,结果保留小数后6位。
样例输入
3样例输出5.166667

我写的程序,错哪里,本人才学疏浅,希望大家帮帮忙
#include<stdio.h>
int main()
{
int n,i;
double c,s,a,b;
s=0;
a=2.0;
b=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
c=a/b;
a=a+b;
b=a;
s=s+c;
}
printf("%.6lf\n",s);
}

#include<stdio.h>
int main()
{
int n,i;
double c,s,a,b;
s=0;
a=2.0;
b=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
c=a/b;
s=s+c;

// 我们假设运行到这里的 a 的值为 x,b 的值为 y
// 我们希望通过下面的运行,让 a 的值变成 x+y,b 的值变成 x。

// 通过这一步,a 的变成了 x+y,达到了要求
a=a+b;

// 我们希望通过这一步,让 b 的值变为 x。
// 但是这里的 a 的值已经不是 x,而是 x+y 了!!!
// 因此最终 b 等于了 x+y。
// 这样,下一轮开始, c = a/b 的值恒等于 1 了
// 这就是为什那么你输入 n,程序最后运行出来的值一定是 n+1 了。

// 那么怎么让 b 的值最终变为 x ,而又不增加新的变量呢?
// 换句话说,我们怎么从现有的变量里面,计算出 x 呢?
// 我们来看现在各个变量的值:变量 a 的值为 x+y,变量 b 的值为 y。
// 没错,a-b 就能计算出值 x 了!
// 因此,只要把下面这一句改为:b=a-b; 就能得到正确的结果了。
b=a;

}
printf("%.6lf\n",s);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-20
你的算法错了——把b=a一句改成b=a-b一切OK!原因自己琢磨……
第2个回答  2012-11-20
#include<stdio.h>
int main()
{
int n,i;
double c,s,a,b,t;//需要多设置一个变量//
s=0;
a=2.0;
b=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
c=a/b;
t=a; //把a的值先给t,然后再给b,到后面a!=b//
a=a+b;
b=t; //像你那样写,到这一步a=b了,结果就错了//
s=s+c;
}
printf("%6lf\n",s);
}
我这运行是对的。
第3个回答  2012-11-20
这个我不告诉你……
第4个回答  2012-11-20
问题出在for循环内的赋值语句:
a=a+b;
b=a;
你这样赋值以后实际上从第二次循环开始a和b的值就始终相同了,相当于从第二次循环开始每次在s上加1,所以会出问题。可以加一个临时变量double t,然后这样赋值:
t=a;
a=a+b;
b=t;
在你的代码上修改的:
#include <stdio.h>
main()
{
int n,i;
double c,s,a,b,t;
s=0.0;
a=2.0;
b=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
c=a/b;
t=a;
a=a+b;
b=t;
s=s+c;
}
printf("%.6lf\n",s);
}