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; }
这段代码试图计算棋盘上麦粒的总数,即2^0 + 2^1 + ... + 2^(n-1)的和。但代码中存在逻辑错误,导致结果不正确。

- 内层循环每次都会重新从b=n开始,但b在每次外层循环迭代时没有被重置,导致内层循环只在第一次执行时正确,后续迭代中b已经变为1,内层循环不再执行,mul的值也不会更新。
- 变量类型不匹配:函数返回类型是unsigned long long,但内部使用了long long,并且main函数中使用了long long来接收结果,可能导致大数溢出或符号问题。

提示:
- 思考内层循环中变量b的初始值应该在哪里设置,才能保证每次外层循环迭代时都能正确计算2的幂。
- 注意函数返回类型和变量类型的一致性,特别是当数值可能很大时。