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
相关产品推荐
相关产品推荐

