Online Compiler C

#include <stdio.h> unsigned long long grains(int n) { long long a, b; long long sum = 0, mul = 1; a=n, b=n; while (a > 0) { while (b > 1) { mul = mul * 2; b--; } sum = sum + mul; a--; } return sum; } int main() { long long x; scanf("%lld", &x); printf("%lld", grains(x)); return 0; }
这段代码试图计算棋盘上前 n 个格子上的麦粒总数(每个格子麦粒数是前一个的两倍,第一个格子是1粒)。但代码中存在逻辑错误,导致结果不正确。

- 内层循环每次从 b 的初始值开始,但 b 在每次外层循环中应该重置为当前格子的指数,而不是一直递减。当前写法导致内层循环只在第一次执行时正确,后续外层循环中 b 已经变成1,内层循环不再执行,mul 没有更新。
- 变量 mul 应该在内层循环开始前重置为1,否则它会累积之前格子的值,导致每个格子都乘上了之前所有格子的倍数。

检查内层循环的初始化和 mul 的重置位置,思考每个格子对应的乘数应该如何独立计算。