求解一道C语言题。答案为什么这么写?

这是原题目:有3堆火柴共48根,现在做如下操作:从第1堆火柴中拿出和第2堆相同的火柴并入第2堆,再从第2堆中拿出与第3堆相同的火柴数并入第3堆,最后从第3堆拿出与现在第1... 这是原题目:
有3堆火柴共48根,现在做如下操作:从第1堆火柴中拿出和第2堆相同的火柴并入第2堆,再从第2堆中拿出与第3堆相同的火柴数并入第3堆,最后从第3堆拿出与现在第1堆相同的火柴数并入第1堆。经过这样的操作后,现在这样的3堆都是16根,问开始操作之前的3堆火柴分别是几根?

这是我在网上找的答案:
#include<stdio.h>

int main()

{ int i,j,a[3]= {16,16,16};

for(i=2; i>-1; i--)

{ a[(i+1)%3]/=2;

a[i]+=a[(i+1)%3];

}

for(j=0; j<3; j++)

printf("%d ",a[j]);

printf("\n");

return 0;

}

我想知道循环内容为什么这么写呀?
展开
 我来答
Navico
2020-07-01 · 雷达、视频、物联网、AI、AR、VR
Navico
采纳数:158 获赞数:1206

向TA提问 私信TA
展开全部
就是把过程倒过来啊
第一堆减半,加到第三堆
第三堆减半,加给第二堆
第二堆减半,加给第一堆
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AeeHI
2020-07-01 · TA获得超过104个赞
知道答主
回答量:135
采纳率:61%
帮助的人:28.1万
展开全部
第1堆是a[0],第2堆是a[1],第3堆是a[2]。
这里说明一下(i+1)%3。表示用(i+1)/3取余数。当i=2时,i+1=3,3/3余数为0,则(i+1)%3=0。
程序的思想是倒推。首先第一个for循环第一条语句执行,此时i=2。 a[(i+1)%3]表示a[0]。a[0]/=2就是把自己本身/2,这样第1堆火柴恢复到第3堆火柴给它火柴之前的状态。然后a[i]+=a[(i+1)%3];这样第3堆火柴刚刚分出去的火柴也加回来了。
然后循环第二遍,此时i=1。a[(i+1)%3]表示a[2]。分析思路相同……
最后数组a[]中存的火柴恢复了初始状态,循环输出一遍完事。
追问
这个求余数思想是怎么想出来的?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式