为什么输入 2 7 这个代码输出为1 错哪了
时间: 2024-09-21 22:07:27 浏览: 28
(完整版)C语言1-7章课后作业答案.doc
在这个代码片段中,`main` 函数试图根据输入的整数 `m` 和 `n` 计算它们之间所有元素的组合数(即组合的阶乘除以 `m` 和 `n-m` 的阶乘)。当输入 `m=2` 和 `n=7` 时,根据题目描述,`if (m == 0)` 条件不会触发,因此会执行:
```cpp
result = fact(n) / ( fact(m) * fact( n - m ) );
```
计算过程如下:
- `fact(7)` 返回 7! (7的阶乘)
- `fact(2)` 返回 2! (2的阶乘)
- `fact(7 - 2)` 返回 5! (5的阶乘)
将这三个结果相除,即 `7! / (2! * 5!)`。然而,这里有一个错误,因为阶乘函数 `fact` 被设计成对于0的阶乘返回1,实际上 `5!` 应该被理解为 `factorial(5)` 而不是 `factorial(0)`。
由于 `5!` 可以被 `2!` 整除,计算过程中实际会得到 `7! / (1 * 5!)`,简化后就是 `7!`。所以当 `m=2` 且 `n=7` 时,`result` 将得到 `7!` 的值,而不是1。因此,代码输出的是 `7!` 而不是预期的1。
要修复这个问题,你需要调整 `fact` 函数的边界情况,使其正确处理0和1的阶乘,这样才能在计算过程中得到正确的结果。例如,可以在 `fact` 函数里添加对0和1的特殊处理:
```cpp
double fact(int n) {
if (n == 0 || n == 1) return 1;
int s = 1, i;
for (i = 1; i <= n; i++) {
s *= i;
}
return s;
}
```
现在,当输入2和7时,你会得到正确的1。
阅读全文