就是我想要求第k项的总和,累加思想不对呀?请问一下是我逻辑哪里出错了吗?
应该是第220和第221行代码那里,第k项的斐波那契值与前第一项斐波那契的值的使用了同一个变量,所以计算出现了错误,可以再使用一个变量存储第k项斐波那契的值;
然后前第1项和第2项斐波那契的的值仍使用f1和f2来单独存储,从而让程序思路更简洁一点;
再针对第1项和第2项的特殊情况可以使用if-else if语句来专门处理;
另外,如果需要计算比较大的斐波那契值,可以把各变量的数据类型改为long 或long long int,甚至double类型也是可以的。
修改如下:
参考链接:
#include <stdio.h>
int main(void){
int f1,f2,sum=0,k;
f1=1; //第一项斐波那契的值
f2=1; //第二项斐波那契的值
int fn; //第n项斐波那契的值
scanf("%d",&k);
// https://blog.csdn.net/pyh2358/article/details/105977440
// https://www.lddgo.net/math/fibonacci
if(k==1){ // 求1项
fn=f1; // 第一项斐波那契的值
sum+=f1; //累加第一项斐波那契的值
printf("第%d项位为%d,前%d项的和为%d\n",k,fn,k,sum);
}else if(k==2){ //求2项
fn=f2; //第二项斐波那契的值
sum+=f1; //累加第一项
sum+=f2; //累加第二项
printf("第%d项位为%d,前%d项的和为%d\n",k,fn,k,sum);
}else{ // 求3项以上
sum+=f1+f2; //求3项以上的和,先累加前两项的和
for(int i=3;i<=k;i++){
fn=f1+f2; // 当前项数列的值为前两项的和
sum+=fn; // 累加当前项
// f1 f2 fn
f1=f2; //前第1项f1的值赋值为第2项
f2=fn; //前第2项f2的值赋值为当前项fn的值,以便为下一项的值作计算准备
}
printf("第%d项位为%d,前%d项的和为%d\n",k,fn,k,sum);
}
return 0;
}
你别忘了,数列前两项都是1
可你循环了K次,但前两项累加值是1吗?你第一个累加项就是5啊,另外这个算法也不对
#include <stdio.h>
int main()
{
int i,n1 = 1,n2=1,t,k;
long long sum = 1;
scanf("%d",&k);
for(i=1;i<k;i++)
{
t = n1;
sum += n1;
n1 = n1+n2;
n2 = t;
}
printf("%lld",sum);
}