斐波拉切数列,累加的思想

就是我想要求第k项的总和,累加思想不对呀?请问一下是我逻辑哪里出错了吗?

img

应该是第220和第221行代码那里,第k项的斐波那契值与前第一项斐波那契的值的使用了同一个变量,所以计算出现了错误,可以再使用一个变量存储第k项斐波那契的值;

然后前第1项和第2项斐波那契的的值仍使用f1和f2来单独存储,从而让程序思路更简洁一点;

再针对第1项和第2项的特殊情况可以使用if-else if语句来专门处理;

另外,如果需要计算比较大的斐波那契值,可以把各变量的数据类型改为long 或long long int,甚至double类型也是可以的。

修改如下:

参考链接:


https://www.lddgo.net/math/fibonacci

#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;
} 


img

你别忘了,数列前两项都是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);
}