求解一道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;
}
我想知道循环内容为什么这么写呀? 展开
有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;
}
我想知道循环内容为什么这么写呀? 展开
2个回答
展开全部
就是把过程倒过来啊
第一堆减半,加到第三堆
第三堆减半,加给第二堆
第二堆减半,加给第一堆
第一堆减半,加到第三堆
第三堆减半,加给第二堆
第二堆减半,加给第一堆
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第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[]中存的火柴恢复了初始状态,循环输出一遍完事。
这里说明一下(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[]中存的火柴恢复了初始状态,循环输出一遍完事。
追问
这个求余数思想是怎么想出来的?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询