打卡 c语言趣味编程 分糖果

发布时间 2023-05-16 21:05:46作者: 起名字真难_qmz

问题描述:

  10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖块数一样多吗?每人各有多少块糖?

思路:

  1. 创建一个长度为10的整数数组,表示每个小孩手中的糖果数量。
  2. 初始化数组的值,按照题目给出的分配方式,将糖果数量赋给对应的小孩。
  3. 使用一个循环,重复以下步骤直到所有小孩手中的糖果数量相同: 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;
}