Online Compiler C

#include <stdio.h> unsigned long long grains(int n) { long long m; long long 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; }
这段代码试图计算棋盘上麦粒的总数(第1格1粒,第2格2粒,第3格4粒,以此类推,每格是前一格的2倍)。但代码中存在逻辑错误,导致计算结果不正确。

- 内层循环 `while (n > 1)` 每次都会从 `n` 的当前值开始计算 `mul`,但 `n` 在每次外层循环中都被修改了,导致 `mul` 的值不是预期的2的幂次。
- 变量 `m` 和 `n` 的初始值相同,但内层循环改变了 `n`,使得后续外层循环中 `n` 的值不再正确,破坏了循环逻辑。