You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++代码更换为long long int类型后失效,int类型下正常运行求助

问题分析与修复:long long类型导致斐波那契求和代码失效

首先,我先帮你梳理下问题:你把代码里的m、数组a的相关变量、循环变量i和总和变量current从int改成long long int后,代码就跑不起来了,但用int的时候完全正常。先看你的原始代码:

#include<iostream> 
using namespace std; 
int main(){ 
    int m,a[m],i,current; // on using long long int here
    cin>>m; 
    a[0]=0; 
    a[1]=1; 
    current=1; 
    for(i=2;i<=m;i++){ 
        a[i]=a[i-1]+a[i-2]; 
        a[i]=a[i]%10; //taking last digit of the fibonacci sequence
        current=current+a[i]; //summing
        current=current%10; 
        cout<<"current="<<current<<"\n"; 
    } 
    cout<<"Last Digit of the sum upto "<<m<<"th Fibonacci number is "<<current; 
}

为什么改成long long就不行了?

主要有两个核心问题:

  • C++不支持变长数组(VLA)
    你写的a[m]是变长数组——数组大小由运行时输入的m决定。这是C99的特性,但C++标准里根本没有这个东西!有些编译器(比如GCC)会把它当成扩展特性支持,但只针对int类型的数组大小。当你把m改成long long后,编译器的扩展逻辑不支持用long long作为数组大小,直接就报错或者崩溃了。

  • 数组下标类型不匹配
    就算编译器勉强支持,C++里数组的下标要求是std::size_t(一种无符号整数类型),你用long long类型的i去访问数组下标,会触发类型不兼容的问题,尤其是当m很大时,还可能出现溢出或者编译器的类型检查报错。

怎么修复?

给你两个方案,从简单替换到优化重构:

方案1:用std::vector替代变长数组

直接把a[m]换成C++标准库的std::vector,它天生支持运行时指定大小,和long long完美兼容:

#include<iostream>
#include<vector> // 别忘了引入vector的头文件
using namespace std;
int main(){ 
    long long m, i, current;
    cin>>m; 
    vector<long long> a(m + 1); // 创建大小为m+1的vector,刚好存下前m+1项斐波那契数
    a[0] = 0; 
    a[1] = 1; 
    current = 1; 
    for(i = 2; i <= m; i++){ 
        a[i] = (a[i-1] + a[i-2]) % 10; // 合并取模,少一步赋值
        current = (current + a[i]) % 10; 
        cout<<"current="<<current<<"\n"; 
    } 
    cout<<"Last Digit of the sum upto "<<m<<"th Fibonacci number is "<<current; 
}

方案2:优化掉数组,节省内存

其实你根本不需要存储整个斐波那契数列——计算下一项只需要前两项的值。这样改不仅解决了类型问题,还能节省大量内存(尤其是当m非常大的时候):

#include<iostream>
using namespace std;
int main(){ 
    long long m, i;
    long long current_sum = 1; // 初始是前1项的和:0+1=1
    long long fib_prev_prev = 0; // 代表第i-2项的斐波那契数
    long long fib_prev = 1; // 代表第i-1项的斐波那契数
    cin>>m; 

    // 处理特殊情况
    if(m == 0){
        current_sum = 0;
    } else if(m == 1){
        current_sum = 1;
    } else {
        for(i = 2; i <= m; i++){ 
            long long fib_current = (fib_prev_prev + fib_prev) % 10;
            current_sum = (current_sum + fib_current) % 10;
            // 更新前两项的值
            fib_prev_prev = fib_prev;
            fib_prev = fib_current;
            cout<<"current="<<current_sum<<"\n"; 
        }
    }
    cout<<"Last Digit of the sum upto "<<m<<"th Fibonacci number is "<<current_sum; 
}

额外提示

因为你只需要最后一位数字,所以每次计算斐波那契数和总和时都立刻取模10,这样可以避免数值溢出(虽然long long能存很大的数,但提前取模更高效,也完全符合你的需求)。

内容的提问来源于stack exchange,提问作者MANUJ AGARWAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:54:29