问题描述:
10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖块数一样多吗?每人各有多少块糖?
思路:
- 创建一个长度为10的整数数组,表示每个小孩手中的糖果数量。
- 初始化数组的值,按照题目给出的分配方式,将糖果数量赋给对应的小孩。
- 使用一个循环,重复以下步骤直到所有小孩手中的糖果数量相同: a. 遍历数组,对每个小孩进行糖果的交换。将每个小孩手中的糖果数量减半,并将结果赋给当前小孩和下一个小孩。 b. 遍历数组,检查每个小孩手中的糖果数量是否为奇数,如果是奇数,则向老师要求一块糖果。将要求的糖果数量加到当前小孩的糖果数量上。 c. 检查所有小孩手中的糖果数量是否相同,如果相同则退出循环,否则继续下一轮交换。
流程图:
代码实现:
#include <iostream> int main() { int candies[10]={10,2,8,22,16,4,10,6,14,20}; // 保存每个小孩手中糖果的数量 bool equal = false; // 所有小孩手中糖果数量是否相同的标志 while (!equal) { // 糖果交换过程 for (int i = 0; i < 10; i++) { int next = (i + 1) % 10; int halfCandies = candies[i] / 2; candies[i] -= halfCandies; candies[next] += halfCandies; } // 检查奇数糖果的情况并向老师要糖果 for (int i = 0; i < 10; i++) { if (candies[i] % 2 != 0) { candies[i]++; } } // 检查所有小孩手中糖果数量是否相同 equal = true; for (int i = 1; i < 10; i++) { if (candies[i] != candies[0]) { equal = false; break; } } } // 输出每个小孩手中糖果的数量 for (int i = 0; i < 10; i++) { std::cout << "第" << (i + 1) << "个小孩手中有" << candies[i] << "块糖果" << std::endl; } return 0; }
标签:10,小孩,candies,编程,手中,int,打卡,糖果 From: https://www.cnblogs.com/qmz-znv2/p/17406803.html