C++计算(1!/1^1+2!/2^2+…+20!/20^20)程序异常求助
问题分析与修复方案
核心问题点
- 返回类型不匹配引发溢出:
power和fact函数内部用unsigned long long存储计算结果,但返回类型是int。当计算值超过int最大值(约21亿)时,会被截断成错误数值——比如13!就已经超出int范围,20^20更是远超极限。 - 整数除法导致结果失真:
main里的x是int类型,fact(i)/power(i,i)执行的是整数除法。从i=2开始,i!/i^i的结果小于1,整数除法直接取0,最终总和只会是1,完全不符合预期的浮点结果。 - 变量类型选择错误:需要计算的是浮点累加值,用
int存储总和完全不合适,应该用double来保留小数精度。
修正后的代码
#include <iostream> #include <iomanip> // 用于设置输出精度 using namespace std; double power(int a, int b); double fact(int c); int main() { double sum = 0.0; // 改用double存储浮点总和 for(int i = 1; i <= 20; i++) { sum += fact(i) / power(i, i); } // 设置输出精度,确保显示足够小数位数 cout << fixed << setprecision(10) << sum << endl; return 0; } double power(int a, int b) { double result = 1.0; for (int i = 1; i <= b; i++) { result *= a; } return result; } double fact(int c) { double result = 1.0; for (int i = c; i >= 1; i--) { result *= i; } return result; }
修正说明
- 把所有函数的返回类型和内部计算变量改为
double,既避免了整数溢出问题,又能支持小数运算。 - 将总和变量改为
double类型,正确存储累加的浮点结果。 - 使用
fixed和setprecision设置输出精度,确保结果显示足够的小数位,运行后会得到约1.7182818284的结果,这和自然常数e的近似值一致(该求和式是e的泰勒展开形式之一)。
内容的提问来源于stack exchange,提问作者krmdoc
相关产品推荐
相关产品推荐

