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

计算nPr/nCr的C程序输出错误排查及单阶乘函数实现求助

问题分析与解决方案

首先,你的程序输出异常的核心问题出在阶乘函数的循环逻辑上,同时存在代码冗余(三个重复的阶乘函数)。下面我会先拆解问题,再给出满足你所有要求的修正代码。

原程序的核心问题

  1. 阶乘计算错误:所有阶乘函数的循环条件写为i < *n_in,这会导致计算的是(n-1)!而非n!。比如当n=5时,循环只会执行到i=4,得到的是1*2*3*4=24(即4!),而不是正确的5!。
  2. 冗余的阶乘函数:三个独立的阶乘函数完全可以合并为一个通用函数,减少代码重复,提升可维护性。

修正后的完整代码

#include <stdio.h>

// 通用阶乘函数:计算任意非负整数的阶乘
unsigned long factorial(int num) {
    unsigned long result = 1;
    // 修正循环条件:i <= num 才能计算到num本身
    for (int i = 1; i <= num; i++) {
        result *= i;
    }
    return result;
}

// 独立输入函数:获取n和r的值,符合main不使用scanf的要求
void input(int *n, int *r) {
    printf("Enter the values of n and r (n >= r >= 0): ");
    scanf("%d %d", n, r);
    // 可选:添加输入验证,避免非法值
    while (*n < *r || *r < 0) {
        printf("Invalid input! Please enter n >= r >= 0: ");
        scanf("%d %d", n, r);
    }
}

// 计算nPr:n!/(n-r)!
void find_nPr(int n, int r, unsigned long *result) {
    *result = factorial(n) / factorial(n - r);
}

// 计算nCr:n!/(r!*(n-r)!)
void find_nCr(int n, int r, unsigned long *result) {
    *result = factorial(n) / (factorial(r) * factorial(n - r));
}

// 独立输出函数:打印结果,符合main不使用printf的要求
void output(unsigned long nPr, unsigned long nCr) {
    printf("nPr : %lu\n", nPr);
    printf("nCr : %lu\n", nCr);
}

int main() {
    int n, r;
    unsigned long nPr_result, nCr_result;
    
    // 完全依赖独立的输入/计算/输出函数,未使用printf/scanf
    input(&n, &r);
    find_nPr(n, r, &nPr_result);
    find_nCr(n, r, &nCr_result);
    output(nPr_result, nCr_result);
    
    return 0;
}

关键修改说明

  1. 统一阶乘函数:将三个重复的阶乘函数合并为factorial,传入任意非负整数即可返回其阶乘,代码更简洁易维护。
  2. 修复阶乘循环逻辑:把循环条件从i < num改为i <= num,确保计算到num本身,得到正确的阶乘值。
  3. 严格遵守main函数限制:main函数中完全没有直接使用printf或scanf,所有输入输出都通过独立实现的input和output函数完成。
  4. 可选输入验证:在input函数中添加了循环验证,确保用户输入的n >= r >= 0,避免因非法输入导致的无意义计算或程序崩溃。
  5. 优化参数传递:对于不需要修改的数值(如计算时的n和r)直接传值,仅在需要修改变量或返回结果时使用指针,代码逻辑更清晰。

内容的提问来源于stack exchange,提问作者Abhiram M V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:47:14