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--; } return sum; } int main() { long long x; scanf("%lld", &x); printf("%lld", grains(x)); return 0; }
这段代码试图计算棋盘上第n个格子及之前所有格子的麦粒总数(每个格子麦粒数是前一个格子的两倍,第一个格子为1粒)。但代码中存在逻辑错误和变量使用问题。

- 变量 `sum` 和 `mul` 没有声明类型,直接使用会导致编译错误。C语言中所有变量必须先声明再使用。
- 内层循环 `while (n > 1)` 会修改参数 `n` 的值,导致外层循环的 `m` 无法正确控制循环次数。因为每次进入内层循环时 `n` 已经被改变,后续外层循环再执行时内层循环的条件会出错。
- 逻辑上,每个格子对应的麦粒数应该独立计算,但当前代码中 `mul` 在内层循环结束后没有重置,导致后续格子计算时累乘了之前的结果。