分糖果问题

问题描述:

某个幼儿园里,有 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++的写法:

#include
using namespace std;
int main() {
 int a, b, c, d, e;
 cin >> a >> b >> c >> d >> e;
 int sum =0;
 sum += a % 3;
 a = a / 3;//a
 e = e + a;
 sum += (b + a) % 3;
 b = (b + a) / 3;
 a = a + b;//b
 sum += (c + b) % 3;
 c = (c + b) / 3;
 b = b + c;
 sum += (d+c) % 3;
 d = (d + c) / 3;
 c = c + d;
 sum += (e + d) % 3;
 e = (e + d) / 3;
 d = d + e;
 a = a + e;//e
 cout << a <<" " << b <<" " << c<<" " << d <<" " << e<

下面是C语言的写法,就直接把输入输出换一下就行了,其余的思想都是不变的:

#include
int main() {
 int a, b, c, d, e;
 scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
 int sum =0;
 sum += a % 3;
 a = a / 3;//a
 e = e + a;
 sum += (b + a) % 3;
 b = (b + a) / 3;
 a = a + b;//b
 sum += (c + b) % 3;
 c = (c + b) / 3;
 b = b + c;
 sum += (d+c) % 3;
 d = (d + c) / 3;
 c = c + d;
 sum += (e + d) % 3;
 e = (e + d) / 3;
 d = d + e;
 a = a + e;//e
 printf("%d %d %d %d %d\n",a,b,c,d,e);
printf("%d",sum);
 return 0;
}

运行结果如下:分糖果问题_第1张图片

 运行结果与题目要求结果一致,属于正确解答,题目解法又很多种,这只是属于我的一种解法,欢迎纠正。

你可能感兴趣的:(c语言,c++)