Online Compiler C

#include <stdio.h> unsigned long long grains(int n) { long long a, b; long long sum = 0, mul = 1; a=n; while (a > 0) { b=n; 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; }
这段代码试图计算棋盘上麦粒的总数,即2^0 + 2^1 + ... + 2^(n-1)的和。但代码中存在逻辑错误,导致计算结果不正确。

- 内层循环每次都将mul从1开始乘以2的(b-1)次方,但mul在外层循环中没有重置为1,导致后续计算时mul继承了上一次循环的累积值,而不是重新从1开始。
- 外层循环的变量a从n开始递减,但内层循环的b每次都重新赋值为n,这会导致每次外层循环时内层循环都重复计算相同的2^(n-1),而不是依次计算2^0, 2^1, ... 2^(n-1)。