C++数列求和函数用long long仍返回负数的问题咨询
数列求和函数溢出问题的分析与解决
问题的核心是整数溢出:你的函数参数n是int类型,计算n*(n+1)时会优先以32位有符号int的规则运算。当n=46341时,n*(n+1)=46341*46342=2147534622,这个值已经超过了32位int的最大值(2147483647),触发溢出后数值变为负数,后续除以2的操作自然得到错误结果。
解决方案
在乘法运算前将n转换为long long类型,让整个计算过程以64位整数执行,避免溢出:
#include <iostream> using namespace std; long long seriesSum(int n) { // 先将n转为long long,确保乘法运算在64位环境下进行 return static_cast<long long>(n) * (n + 1) / 2; } int main() { cout << seriesSum(46341); // 正确输出1073767311 return 0; }
另一种可选方案
直接将函数参数类型改为long long,从根源上避免int类型的限制:
long long seriesSum(long long n) { return n * (n + 1) / 2; }
两种方案都能解决问题,前者兼容int类型输入,后者更直观适合处理大范围数值。
内容的提问来源于stack exchange,提问作者Jalal Hammash
相关产品推荐
相关产品推荐

