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

这是原题目:
有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;

}

我想知道循环内容为什么这么写呀?

第1个回答  2020-07-01
就是把过程倒过来啊
第一堆减半,加到第三堆
第三堆减半,加给第二堆
第二堆减半,加给第一堆
第2个回答  2020-07-01
第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[]中存的火柴恢复了初始状态,循环输出一遍完事。追问

这个求余数思想是怎么想出来的?

本回答被提问者采纳