Java 10个小孩围成一圈分糖果,老师顺次分给每个人的糖块数为12,2,8,22,16,4,10,6, 14,20。

10个小孩围成一圈分糖果,老师顺次分给每个人的糖块数为12,2,8,22,16,4,10,6, 14,20。
然后按下列规则调整,所有小孩同时把自己的糖果分一半给右边的小孩,糖块数变为奇数的人,
再向老师补要一块,问经过多少次调整后,大家的糖块一样多,且每人多少块。
int[] arr = {12,2,8,22,16,4,10,6,14,20};
        int[] temp = new int[10];    //定义一个用来转移数据的数组
        int item = 0;   //用来计数
        while(true){
            for(int i = 0; i < arr.length; i++){         // 用temp 来存放 arr对应的一半
                temp[i] = arr[i]/2;
            }

            for(int i = 1; i < arr.length; i++){          //  下方代码的循环缩写。
                arr[i] = arr[i]/2 + temp[i-1];
            }
//            arr[1] = arr[1]/2+temp[0];
//            arr[2] = arr[2]/2+temp[1];
//            arr[3] = arr[3]/2+temp[2];
//            arr[4] = arr[4]/2+temp[3];
//            arr[5] = arr[5]/2+temp[4];
//            arr[6] = arr[6]/2+temp[5];
//            arr[7] = arr[7]/2+temp[6];
//            arr[8] = arr[8]/2+temp[7];
//            arr[9] = arr[9]/2+temp[8];
            arr[0] = arr[0]/2+temp[9];

            for(int i = 0; i < arr.length; i++){    // 判断是否是奇数,奇数加 1
                if(arr[i]%2 != 0){
                    arr[i] = arr[i]+1;
                }
            }
            item ++;
            if(arr[0]==arr[1]&&arr[1]==arr[2]&&arr[2]==arr[3]&&arr[3]==arr[4]
             &&arr[4]==arr[5]&&arr[5]==arr[6]&&arr[6]==arr[7]
            &&arr[7]==arr[8]&&arr[8]==arr[9]){              //  虽然写的难看,但是效率比循环高
                break;
            }
            System.out.println(Arrays.toString(arr));       // 每一次执行完 打印出来看一看
        }
        System.out.println("经过 "+item+" 次后 小朋友的糖果一样,有 "+arr[4]+"个");

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题可以用模拟的方式来实现。首先,我们可以使用一个数组来保存每个小孩手中的糖果数量。然后,我们可以使用一个循环来模拟每一次糖果的分配过程,直到所有小孩手中的糖果数量都一样为止。 具体的实现步骤如下: 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; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值