用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
相关产品推荐
相关产品推荐

