算法_数学问题_Question3_分糖果(java实现)

这篇文章讲述的是算法初级部分的分糖果问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。

问题描述

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

算法分析

题目本身是个很好理解的问题,使用数组candy存放每个小孩的糖果数,在对数组进行操作即可,但要注意两个问题:
1. 小孩们同时将糖果分出去
2. 第10个小孩右边是第1个小孩
可以采用数组half来记录每个孩子手中一半的糖果,这样在操作candy时就相当于同时操作。
candy[(i+1)%10]即可以保证第10个小孩右边是第1个小孩

代码实现

package mathematics;

public class Q3_Candy {
    /**
     * 问题描述:10个孩子围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩
     *          8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小
     *          孩6块,第9个小孩14块,第10个小孩20块。然后所有小孩同时将手中的糖分一半给
     *          右边的小孩:糖果数为奇数的小孩可以向老师要一块。问经过这样几次后大家手中
     *          的糖果数量相同?为多少?
     * 
     * 算法分析:题目本身是个很好理解的问题,使用数组candy存放每个小孩的糖果数,在对数组
     *          进行操作即可,但要注意两个问题:
     *                                      1. 小孩们同时将糖果分出去
     *                                      2. 第10个小孩右边是第1个小孩
     *          可以采用数组half来记录每个孩子手中一半的糖果,这样在操作candy时就相当于
     *          同时操作。
     *          candy[(i+1)%10]即可以保证第10个小孩右边是第1个小孩
     */
    public static void main(String[] args) {
        int candy[] ={10,2,8,22,16,4,10,6,14,20} ;              //初始化小孩手中的糖果数
        int times = 1 ;                                         //记录执行次数
        print(candy) ;
        while(!isEqual(candy)){                                 //若数量不相同循环
            int half[] = new int [candy.length];                //记录每一小孩手中的糖果的一半
            //将小孩手中的糖果数分为一半
            for(int i=0 ; i<candy.length ; i++){
                if(candy[i]%2==0){                              //为偶数的小孩直接分出一半
                    half[i] = candy[i]/2 ;
                }else{                                          //为奇数的小孩可以申请一块糖果再分一半
                    candy[i]+=1 ;
                    half[i] = candy[i]/2 ;
                }
            }
            //小孩们同时将手中的糖果分给右边的小孩
            for(int j=0 ; j<candy.length ; j++){
                candy[(j+1)%candy.length] += half[j] ;          //分出一半
                candy[j]-=half[j] ;                             //减少一半
            }

            System.out.print("第"+times+"次:");
            print(candy) ;
            times++ ;
        }
    }
    private static boolean isEqual(int candy[]){
        for(int i=0 ; i<candy.length ;i++){
            if(candy[0]!=candy[i])
                return false ;
        }
        return true ;
    }
    private static void print(int []candy){
        System.out.print("糖果个数分别为: ");
        for(int i=0 ; i<candy.length ; i++){
            System.out.print(candy[i]+" ");
        }
        System.out.println();
    }
}

样例输出

糖果个数分别为: 10 2 8 22 16 4 10 6 14 20 
第1次:糖果个数分别为: 15 6 5 15 19 10 7 8 10 17 
第2次:糖果个数分别为: 17 11 6 11 18 15 9 8 9 14 
第3次:糖果个数分别为: 16 15 9 9 15 17 13 9 9 12 
第4次:糖果个数分别为: 14 16 13 10 13 17 16 12 10 11 
第5次:糖果个数分别为: 13 15 15 12 12 16 17 14 11 11 
第6次:糖果个数分别为: 13 15 16 14 12 14 17 16 13 12 
第7次:糖果个数分别为: 13 15 16 15 13 13 16 17 15 13 
第8次:糖果个数分别为: 14 15 16 16 15 14 15 17 17 15 
第9次:糖果个数分别为: 15 15 16 16 16 15 15 17 18 17 
第10次:糖果个数分别为: 17 16 16 16 16 16 16 17 18 18 
第11次:糖果个数分别为: 18 17 16 16 16 16 16 17 18 18 
第12次:糖果个数分别为: 18 18 17 16 16 16 16 17 18 18 
第13次:糖果个数分别为: 18 18 18 17 16 16 16 17 18 18 
第14次:糖果个数分别为: 18 18 18 18 17 16 16 17 18 18 
第15次:糖果个数分别为: 18 18 18 18 18 17 16 17 18 18 
第16次:糖果个数分别为: 18 18 18 18 18 18 17 17 18 18 
第17次:糖果个数分别为: 18 18 18 18 18 18 18 18 18 18 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值