
分析问题
想象一下,有5个小朋友围坐在一张圆桌旁,编号分别是1、2、3、4、5号。他们每个人手里都有一些糖果(糖果数量是整数)。现在,他们玩一个分糖果游戏,规则是这样的:
- 从1号小朋友开始,按顺序轮流分糖果(1号→2号→3号→4号→5号)。
- 每个小朋友分糖果时:
- 把自己的糖果平均分成三份(如果不能整除,就把多余的糖果吃掉)。
- 自己留一份。
- 把另外两份分别分给左边和右边的小朋友(因为是圆桌,所以1号的左边是5号、右边是2号;2号的左边是1号、右边是3号;3号的左边是2号、右边是4号;4号的左边是3号、右边是5号;5号的左边是4号、右边是1号)。
- 分完后,糖果数量会变化,下一个小朋友分糖果时,用的是当前最新的糖果数量。
游戏进行一轮(所有5个小朋友都分一次糖果),然后我们看看每个人手里还剩多少糖果。
建立模型(用简单步骤模拟)
我们可以用5个变量来表示每个小朋友的糖果数量(比如叫 s1, s2, s3, s4, s5)。然后按照顺序模拟每个小朋友的操作:
- 1号小朋友分糖果:
- 计算每份糖果:
份数 = s1 / 3(整数除法,只取整数部分,余数被吃掉)。 - 自己留一份:
s1 = 份数。 - 左边(5号)和右边(2号)各得一份:
s5 += 份数,s2 += 份数。
- 2号小朋友分糖果:
- 计算每份糖果:
份数 = s2 / 3(注意:s2 可能已经被1号分糖果时改变)。 - 自己留一份:
s2 = 份数。 - 左边(1号)和右边(3号)各得一份:
s1 += 份数,s3 += 份数。
- 3号小朋友分糖果:
- 计算每份糖果:
份数 = s3 / 3(s3 可能已经被前面的操作改变)。 - 自己留一份:
s3 = 份数。 - 左边(2号)和右边(4号)各得一份:
s2 += 份数,s4 += 份数。
- 4号小朋友分糖果:
- 计算每份糖果:
份数 = s4 / 3(s4 可能已经被前面的操作改变)。 - 自己留一份:
s4 = 份数。 - 左边(3号)和右边(5号)各得一份:
s3 += 份数,s5 += 份数。
- 5号小朋友分糖果:
- 计算每份糖果:
份数 = s5 / 3(s5 可能已经被前面的操作改变)。 - 自己留一份:
s5 = 份数。 - 左边(4号)和右边(1号)各得一份:
s4 += 份数,s1 += 份数。
一轮结束后,输出 s1, s2, s3, s4, s5 的值。
编写程序(C++)
下面是完整的C++程序,实现了上述模型。程序会读取一行输入(五个整数),然后模拟分糖果过程,最后输出结果。
#include <bits/stdc++.h>
using namespace std;
int main() {
// 读取输入:五个整数,代表初始糖果数(顺序:1号, 2号, 3号, 4号, 5号)
int a, b, c, d, e;
cin >> a >> b >> c >> d >> e;
// 初始状态:s1, s2, s3, s4, s5 分别代表1~5号小朋友的当前糖果数
int s1 = a, s2 = b, s3 = c, s4 = d, s5 = e;
// 1号小朋友分糖果
int q1 = s1 / 3; // 每份糖果的数量(整数除法,余数被吃掉)
s1 = q1; // 自己留一份
s5 += q1; // 左边(5号)得一份
s2 += q1; // 右边(2号)得一份
// 2号小朋友分糖果
int q2 = s2 / 3; // 用当前s2计算
s2 = q2; // 自己留一份
s1 += q2; // 左边(1号)得一份
s3 += q2; // 右边(3号)得一份
// 3号小朋友分糖果
int q3 = s3 / 3; // 用当前s3计算
s3 = q3; // 自己留一份
s2 += q3; // 左边(2号)得一份
s4 += q3; // 右边(4号)得一份
// 4号小朋友分糖果
int q4 = s4 / 3; // 用当前s4计算
s4 = q4; // 自己留一份
s3 += q4; // 左边(3号)得一份
s5 += q4; // 右边(5号)得一份
// 5号小朋友分糖果
int q5 = s5 / 3; // 用当前s5计算
s5 = q5; // 自己留一份
s4 += q5; // 左边(4号)得一份
s1 += q5; // 右边(1号)得一份
// 输出结果:五个小朋友的剩余糖果数(顺序:1号, 2号, 3号, 4号, 5号)
cout << s1 << " " << s2 << " " << s3 << " " << s4 << " " << s5 << endl;
return 0;
}