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

用C++函数求级数和:阶乘函数定义及代码正确性排查

问题分析与代码修正

原代码中的错误

  • 变量重定义:sum函数内重复定义了参数x,会触发编译错误。
  • 阶乘函数未实现且声明错误:仅声明了float fact(float, float);,但阶乘函数只需接收一个整数参数,且没有编写具体实现逻辑。
  • 数据类型不合理:用float处理阶乘会导致精度丢失,阶乘是整数运算,应使用int或long long避免溢出。
  • 循环范围错误:原循环i <= n会执行n+1次,超出了“计算第n项”的要求,应改为i < n。
  • 级数项逻辑错误:原代码中奇数项(i%2==0)的分子是i+1!,不符合题目给出的1!、5!、9!...的规律,正确的分子应为2*i+1!。

正确的阶乘函数实现

阶乘的计算逻辑为n! = 1×2×3×…×n,其中0!和1!均为1。这里使用long long类型存储结果,避免小范围溢出:

long long fact(int num) {
    if (num <= 1) {
        return 1;
    }
    long long result = 1;
    for (int i = 2; i <= num; i++) {
        result *= i;
    }
    return result;
}

修正后的完整代码

#include <iostream>
using namespace std;

long long fact(int num);
double sum(int n, int y);

int main() {
    int n, y;
    cout << "enter n and y" << endl;
    cin >> n >> y;

    double s = sum(n, y);

    cout << "sum = " << s << endl;
    return 0;
}

long long fact(int num) {
    if (num <= 1) {
        return 1;
    }
    long long result = 1;
    for (int i = 2; i <= num; i++) {
        result *= i;
    }
    return result;
}

double sum(int n, int y) {
    double s = 0.0;
    long long y_fact = fact(y); // 提前计算y!,减少重复计算

    for (int i = 0; i < n; i++) {
        int term_num = 2 * i + 1;
        long long term_fact = fact(term_num);
        if (i % 2 == 0) {
            s += static_cast<double>(term_fact) / y_fact;
        } else {
            s += static_cast<double>(y_fact) / term_fact;
        }
    }
    return s;
}

补充说明

  • 将n和y的类型改为int,符合正整数的输入需求;阶乘用long long存储,避免数值溢出。
  • 提前计算y!,避免循环内重复调用阶乘函数,提升运行效率。
  • 用double存储求和结果,保证除法运算的精度。
  • 修正后的循环逻辑严格对应题目要求:第1项(i=0)为1!/y!,第2项(i=1)为y!/3!,第3项(i=2)为5!/y!,依次计算至第n项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:06:24