求解AP第N项的C++代码输出异常大数,问题出在哪里?
AP第N项C++代码输出异常大数问题排查
错误原因
- 数组越界风险:你声明了
int arr[10]只有10个存储空间,当输入的N大于10时,循环中arr[i] = current会写入非法内存,后续读取arr[N-1]也会拿到不确定的垃圾值,就是你看到的异常大数。而且求解等差数列第N项根本不需要用数组存储所有项,浪费空间还容易出问题。 - current值未正确更新:循环内的
current + d;是无效语句,没有将计算结果赋值回current,整个循环中current的值始终等于A1,逻辑完全错误。正确写法是current = current + d;或者简化为current += d;。 - 函数未返回有效值:
nthTermOfAP函数声明返回值类型是int,但你只在函数内执行了cout操作,没有写return语句返回结果。主函数中cout << ob.nthTermOfAP(A1, A2, N) << "\n";输出的是函数返回的随机垃圾值,这是你看到异常大数最直接的原因。
是否需要初始化变量为0?
不需要额外把变量初始化为0,你当前的问题和变量未初始化无关,只要修复上述三个错误即可。也可以直接用等差数列通项公式一步计算,不需要循环,效率更高:A1 + (N-1)*(A2 - A1)
修正后代码示例
class Solution { public: int nthTermOfAP(int A1, int A2, int N) { int d = A2 - A1; // 直接用通项公式计算,不需要循环和数组 return A1 + (N - 1) * d; } }; // { Driver Code Starts. int main() { int t; cin >> t; while (t--) { int A1, A2, N; cin >> A1 >> A2 >> N; Solution ob; cout << ob.nthTermOfAP(A1, A2, N) << "\n"; } } // } Driver Code Ends
如果一定要用循环实现,修正后的版本如下:
class Solution { public: int nthTermOfAP(int A1, int A2, int N) { int d = A2 - A1; int current = A1; for (int i = 1; i < N; i++) { current += d; } return current; } };
内容的提问来源于stack exchange,提问作者Rachel Peters
相关产品推荐
相关产品推荐

