计算nPr/nCr的C程序输出错误排查及单阶乘函数实现求助
问题分析与解决方案
首先,你的程序输出异常的核心问题出在阶乘函数的循环逻辑上,同时存在代码冗余(三个重复的阶乘函数)。下面我会先拆解问题,再给出满足你所有要求的修正代码。
原程序的核心问题
- 阶乘计算错误:所有阶乘函数的循环条件写为
i < *n_in,这会导致计算的是(n-1)!而非n!。比如当n=5时,循环只会执行到i=4,得到的是1*2*3*4=24(即4!),而不是正确的5!。 - 冗余的阶乘函数:三个独立的阶乘函数完全可以合并为一个通用函数,减少代码重复,提升可维护性。
修正后的完整代码
#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; }
关键修改说明
- 统一阶乘函数:将三个重复的阶乘函数合并为
factorial,传入任意非负整数即可返回其阶乘,代码更简洁易维护。 - 修复阶乘循环逻辑:把循环条件从
i < num改为i <= num,确保计算到num本身,得到正确的阶乘值。 - 严格遵守main函数限制:main函数中完全没有直接使用
printf或scanf,所有输入输出都通过独立实现的input和output函数完成。 - 可选输入验证:在
input函数中添加了循环验证,确保用户输入的n >= r >= 0,避免因非法输入导致的无意义计算或程序崩溃。 - 优化参数传递:对于不需要修改的数值(如计算时的n和r)直接传值,仅在需要修改变量或返回结果时使用指针,代码逻辑更清晰。
内容的提问来源于stack exchange,提问作者Abhiram M V
相关产品推荐
相关产品推荐

