You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

修正说明

  1. 把所有函数的返回类型和内部计算变量改为double,既避免了整数溢出问题,又能支持小数运算。
  2. 将总和变量改为double类型,正确存储累加的浮点结果。
  3. 使用fixed和setprecision设置输出精度,确保结果显示足够的小数位,运行后会得到约1.7182818284的结果,这和自然常数e的近似值一致(该求和式是e的泰勒展开形式之一)。

内容的提问来源于stack exchange,提问作者krmdoc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:45:27