分糖果问题 方法一

10个小孩围成一圈分糖果,老师分给第一个孩子10块,第二个小孩2块,后面依次分的糖果数量为8、22、16、4、10、6、14、20。然后所有的小孩同时将手中的糖果分一半给右边的小孩,糖果为奇数的可向老师要一块。问经过几次后,大家手中的糖果的块数将一样多,每个人有多少糖果。

这个问题的关键在于“所有的小孩同时将手中的糖果分一半给右边的小孩”之后每个人的糖果数是如何变化的?

    //每个小孩糖果初始值以及循环次数初始值
    int[] arr = {10, 2, 8, 22, 16, 4, 10, 6, 14, 20};
    int times = 0;

    //循环继续的条件是任意两个小孩的糖果数不相等
    // 函数isEqual()判断任意两个小孩的糖果数是否相等
    while(isEqual(arr))
    {
        //因为是围成一圈,到最后一个小孩被第一个小孩分一半的糖果时,
        // 第一个小孩的糖果已经计算过 发生变化了,而最后一个与第一个是有关系的
        // 防止被覆盖 先临时保存下来
        int temp1 = arr [0];

        //第0-8个孩子的糖果变化
        for(int i = 0;i<9;i++)
        {
            arr [i] = (arr [i]+arr [i+1])/2;
        }
        arr [9] =( temp1+arr [9])/2;//第9个孩子的糖果变化

        times ++;//分配完毕 循环次数增加

        for(int j = 0; j<10; j++)//谁的糖果为奇数就增加1
        {
           if(arr [j] % 2!=0)
               arr [j]++;
        }
    }

    System.out.printf("经过%d次的交换,每个人都有%d颗糖",times ,arr [0]);

}

/**
 *判断一个一维数组的所有元素是否相等
 * @param arr 数组
 * @return true-相等 false-不相等
 */
private static boolean isEqual(int[] arr) {

    int length = arr .length ;
    //将一个数和它后面的每个数进行比较 不相等就跳出
    for(int i= 0;i<length ;i++)
    {
        for(int j=i+1;j<length ;j++)
        {
            if(arr [i]!= arr [j])
               return true ;
        }
    }
    return false  ;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值