递归立方和计算函数未累加首次调用结果问题求助
问题分析与修复方案
问题根源
你的代码输出错误的核心原因有两个:
pow函数的浮点数精度误差:pow(i,3)返回double类型,部分整数立方的计算结果会因为浮点数精度问题出现微小偏差(比如pow(5,3)可能得到124.99999999999999而非精确的125)。当将这个值赋值给int类型的sum时,会直接截断小数部分,导致少累加1,最终N=5时结果少1。- 变量类型不匹配:
sum定义为int,但函数返回long long,不仅会放大精度问题,还会在N较大时出现整数溢出。
修复方案
推荐使用整数乘法计算立方,彻底避免浮点数精度问题,同时统一变量类型为long long:
using namespace std; long long calSum(long long i, long long n) { if (i > n) return 0; // 用整数乘法计算立方,完全避免浮点数精度问题 long long cube = i * i * i; return cube + calSum(i + 1, n); } int main() { int n; cin >> n; cout << calSum(1, n) << endl; return 0; }
如果坚持使用pow函数,需要通过加0.5的方式修正精度误差,并修正变量类型:
using namespace std; long long calSum(long long i, long long n) { if (i > n) return 0; // 加0.5后再转换,修正浮点数精度带来的截断误差 long long cube = static_cast<long long>(pow(i, 3) + 0.5); return cube + calSum(i + 1, n); } int main() { int n; cin >> n; cout << calSum(1, n) << endl; return 0; }
内容的提问来源于stack exchange,提问作者naren_007
相关产品推荐
相关产品推荐

