分糖果问题
问题描述:
某个幼儿园里,有 5 位小朋友编号依次为 1,2,3,4,5他们按照自己的编号顺序围坐在一张圆桌旁。他们身上有若干糖果,现在他们玩一个分糖果游戏。从 1 号小朋友开始,将自己的糖果均分成 3 份(如果有多余的糖果,就自己立即吃掉),自己留一份,其余两份分给和他相邻的两个小朋友。接着 2,3,4,5 号小朋友也这样做。问一轮结束后,每个小朋友手上分别有多少糖果。
输入格式
一行,5 个用空格隔开的 int 范围内的正整数,分别是游戏开始时 1,2,3,4,5号小朋友手里糖果的数量。
输出格式
2 行,第 1 行是用一个空格隔开的 5个整数,表示一轮游戏结束后 1,2,3,4,5 号小朋友手里糖果的数量。第 2行是一个整数,表示一轮游戏过程中吃掉的糖果的总数。
输入样例: 输出样例:
8 9 10 11 12 11 7 9 11 6
6
问题分析:
首先我们把1,2,3,4,5号小朋友的糖果数量依次定义为a,b,c,d,e,从1号小朋友开始分糖果,也就是1号小朋友剩下a/3,其余的a/3分给了b和e,a%3属于是1号小朋友吃掉的糖果数量,当2号小朋友分糖果时,分的糖果总数量是b+a/3,因为a的糖果数量分给了他,他全部都要拿出来平均分成三份,自己剩下一份,其余的两份分给相邻的两位小朋友,2号小朋友分完后,2号小朋友剩下的糖果数量为(b+a/3)/3,其余的两份分给了相邻的两位,也就是a和c,b吃掉的糖果数量为(b+a/3)%3,所以b分完后,1号小朋友剩下的糖果数量为a/3+(b+a/3)/3,我们把(b+a/3)/3赋值给b,因为b分完后只剩下(b+a/3)/3,那么a的糖果数量就可以表示为a+b,c的糖果数量为c+b,然后轮到b分糖果,依次类推,直到e分完后结束,此时a的糖果数量还要加上e/3,因为a和e相邻,e分完后又自己的三分之一分给了a,这样一圈下来后,a的糖果数量为:a+b+e;b的糖果数量为:b+a+c;c的数量为:c+b+d;d的糖果数量为:d+c+e;e的数量为:e+d+a;我们前面已经把分成三份的一份赋值给了他自己,所以我们这里直接加上我们赋值过后的变量就可以了,比如这里的a,实际上等于a/3,这里的b,实际上是(b+a/3)/3,实际上是等于(c+(b+(a/3))/3),依次类推,下面直接上代码:
这里是C++的写法:
下面是C语言的写法,就直接把输入输出换一下就行了,其余的思想都是不变的:
运行结果如下:
运行结果与题目要求结果一致,属于正确解答,题目解法又很多种,这只是属于我的一种解法,欢迎纠正。
这是属于我的原创文章,之前在CSDN上发布过,后面我直接转载在此处。若有版权侵犯,请联系删除。