Online Compiler C

#include <stdio.h> unsigned long long grains(int n) { int result = 1, x = 1; for (int i = 1; i <= n; i++) { x = x * 2; } result = result * x; return result; } int main() { return 0; }
这段代码定义了一个函数 `grains`,看起来是想计算棋盘上第 n 个格子的麦粒数(通常第一个格子是1粒,第二个是2粒,第三个是4粒,以此类推,即 2^(n-1))。但代码中存在一些逻辑问题。

- 变量 `result` 初始为1,但最终只乘以了 `x` 一次,而 `x` 在循环中从1开始乘以2共 n 次,得到的是 2^n,而不是 2^(n-1)。例如 n=1 时,循环执行一次,x=2,result=2,但正确结果应为1。
- 变量 `result` 和 `x` 都是 `int` 类型,但函数返回类型是 `unsigned long long`,当 n 较大时 `int` 会溢出,导致结果错误。