Онлайн компилятор C

#include <stdio.h> unsigned long long grains(unsigned long long n) { unsigned long long sum=1; unsigned long long i=1; sum=sum-1; while(i<=n){ sum=sum*2; i++; } return sum; } int main() { unsigned long long x,answer; scanf("%llu",&x); answer = grains(x); printf("%llu",answer); return 0; }
这段代码试图计算棋盘上第 n 个格子上的麦粒数(即 2 的 n-1 次方),但实现中有逻辑错误。

- 代码中 `sum=sum-1` 将 sum 初始化为 0,然后循环中每次乘以 2,这样当 n=1 时,循环一次后 sum 变为 0,而不是正确的 1。
- 循环的起始和乘法逻辑导致结果偏移:对于 n=1,正确结果应为 1,但你的代码返回 0;对于 n=2,正确结果应为 2,你的代码返回 0 等。

- 提示1:思考一下,当 n=1 时,循环应该执行几次?循环开始前 sum 应该是什么值才能让第一次乘法后得到正确结果?
- 提示2:检查循环的初始条件和乘法顺序,是否应该先乘再循环,或者调整 sum 的初始值来避免多余的减法操作?