#include<stdio.h> #include<math.h> int main() { int sum,n,i,m,num; num = 1; sum = 0; scanf("%d", &n); for (i = 1; i <= n; i++) { for (m = 1; m <= i; i++) { num *= m; } sum += (int)pow(2, i) * num; } printf("%d", sum); } 检查代码为什么没法正常输出计算结果
时间: 2025-03-07 15:10:30 浏览: 85
### 代码分析
你提供的 C 语言程序包含一些逻辑错误和语法错误,导致无法正常输出预期的结果。我们逐行分析并指出问题所在:
```c
#include <stdio.h>
#include <math.h>
int main() {
int sum, n, i, m, num;
num = 1;
sum = 0;
// 输入变量 n 的值
scanf("%d", &n);
for (i = 1; i <= n; i++) { // 循环从 1 到 n
for (m = 1; m <= i; i++) { // 这里的循环条件有问题
num *= m;
}
sum += (int)pow(2, i) * num;
}
printf("%d\n", sum); // 输出最终结果
}
```
#### 主要问题:
1. **内层 `for` 循环的控制变量**:
```c
for (m = 1; m <= i; i++)
```
内层 `for` 循环应该使用 `m++` 而不是 `i++`。当前代码中 `i++` 导致外层 `for` 循环的终止条件失效,进而造成无限循环。
2. **`num` 变量未重置**:
每次进入新的 `i` 值时,`num` 应该重新初始化为 `1`,否则它会累积之前的所有乘积。
3. **整数溢出风险**:
如果输入较大的 `n` 值,则可能导致 `sum` 和 `num` 发生整数溢出,因为它们都是 `int` 类型,范围有限。
4. **浮点精度损失**:
使用 `(int)pow(2, i)` 将 float 结果强制转换成 int,可能会带来精度丢失的问题。建议直接用位运算代替幂函数。
5. **缺少换行符**:
最后的 `printf` 缺少换行符 `\n`,虽然不影响功能,但在某些终端上显示效果更好。
---
### 修改后的代码:
以下是修正过后的版本,并添加了注释帮助理解每一步的作用:
```c
#include <stdio.h>
// 删除 math.h 因为我们不再需要 pow 函数
int main() {
int sum = 0, n, i, j;
// 输入 n 的值
printf("请输入正整数 n:");
scanf("%d", &n);
if (n >= 1 && n <= 12) { // 设置合理范围内防止数据过大溢出
for (i = 1; i <= n; ++i) {
long long factorial = 1LL; // 长整形存储阶乘避免溢出
// 计算 i! 即 i 的阶乘
for (j = 1; j <= i; ++j)
factorial *= j;
// 累加项 2^i × i!
sum += ((long long)(1 << i)) * factorial;
// 强制将累加和转回 int 类型以防超出限制
if (sum > INT_MAX || sum < INT_MIN){
printf("数值超过 int 范围。\n");
return -1;
}
}
// 打印最后的答案加上换行符
printf("计算得到的结果:%d\n", sum);
} else {
printf("输入的有效范围应在 [1, 12]之间。\n");
}
return 0;
}
```
此版本解决了上述所有提到的问题,并增加了对大数字情况下的保护机制。
阅读全文
相关推荐



















