Online Compiler C

#include <stdio.h> unsigned long long grains(int n) { int m; sum = 0, mul = 1; m = n; while (m > 0) { while (n > 1) { mul = mul * 2; n--; } sum = sum + mul; m--; } } int main() { int x; scanf("%lld", &x); printf("%lld", grains(x)); return 0; }
这段代码试图计算棋盘上麦粒的总数(第1格1粒,第2格2粒,第3格4粒,以此类推),但存在几个问题。

- 变量 `sum` 和 `mul` 没有声明类型,编译器会报错。
- 函数 `grains` 没有 `return` 语句,没有返回计算结果。
- 内层循环的逻辑有误:每次外层循环都会重新从 `n` 的原始值开始乘2,导致结果重复计算。
- `scanf` 和 `printf` 中使用了 `%lld`,但 `x` 是 `int` 类型,格式说明符不匹配。

- 检查变量 `sum` 和 `mul` 是否在函数内正确定义了类型。
- 思考内层循环的意图:每次外层循环减少 `m` 时,内层循环是否应该重新从1开始乘2?还是应该只乘一次2?