十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?c++实现
时间: 2023-09-23 16:12:07 浏览: 209
这道题可以用模拟的方式来实现。首先,我们可以使用一个数组来保存每个小孩手中的糖果数量。然后,我们可以使用一个循环来模拟每一次糖果的分配过程,直到所有小孩手中的糖果数量都一样为止。
具体的实现步骤如下:
1. 定义一个数组 candy,用来保存每个小孩手中的糖果数量。
2. 初始化数组 candy,将老师分给第一个小孩的10块糖果放入 candy[0] 中,将第二个小孩的2块糖果放入 candy[1] 中,以此类推。
3. 使用一个循环来模拟每一次糖果的分配过程,直到所有小孩手中的糖果数量都一样为止。在每一次循环中,我们需要完成以下步骤:
a. 遍历数组 candy,将每个小孩手中的糖果数量除以2,并将结果向右取整。
b. 遍历数组 candy,将每个小孩手中的糖果数量加上它右边小孩手中的糖果数量。
c. 遍历数组 candy,如果某个小孩手中的糖果数量为奇数,就向老师要一块糖果。
d. 检查数组 candy 中所有元素是否相等,如果相等就跳出循环。
4. 输出数组 candy 中的元素,即每个小孩手中的糖果数量。
下面是完整的 C++ 代码实现:
```c++
#include <iostream>
using namespace std;
int main() {
int candy[10] = {10, 2, 8, 22, 16, 4, 10, 6, 14, 20}; // 初始化糖果数量
bool flag = false; // 标记是否所有小孩手中的糖果数量都一样
while (!flag) {
// 将每个小孩手中的糖果数量除以2,并将结果向右取整
for (int i = 0; i < 10; i++) {
candy[i] = candy[i] / 2;
if (i == 9) {
candy[0] += candy[i]; // 最后一个小孩将糖果分给第一个小孩
} else {
candy[i+1] += candy[i]; // 将糖果分给右边的小孩
}
}
// 如果某个小孩手中的糖果数量为奇数,就向老师要一块糖果
for (int i = 0; i < 10; i++) {
if (candy[i] % 2 == 1) {
candy[i]++;
if (i == 9) {
candy[0]--; // 最后一个小孩向老师要糖果
} else {
candy[i+1]--; // 向右边的小孩要糖果
}
}
}
// 检查数组 candy 中所有元素是否相等
flag = true;
for (int i = 0; i < 9; i++) {
if (candy[i] != candy[i+1]) {
flag = false;
break;
}
}
}
// 输出每个小孩手中的糖果数量
for (int i = 0; i < 10; i++) {
cout << "第" << i+1 << "个小孩手中有" << candy[i] << "块糖果。" << endl;
}
return 0;
}
```
阅读全文