分糖果

题目:   十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?

思路:重复分糖果的过程,用一个数组存放每一个小孩手中的糖,通过循环修改数组中的数,最终达到都相等的目的。可以定义两个方法,一个判断所以人的糖果数量是不是都相等,是就结束循环,一个用来输出每次分过后每个人手中的糖果数量。分糖果是为了防止最后一个人的糖果个数被覆盖,可以先存放起来。

如果是奇数的话,加一个糖果继续循环,知道结束。(写的时候弄成了不是奇数的话加一个糖果,结果找了半天的错误,懵逼啊,还是得仔细些再见

源代码:

public class Tang {
	public static void main(String args[]){
		long begin=System.currentTimeMillis();
		int tang[]={10,2,8,22,16,4,10,6,14,20};          //最开始每个人手里的糖果
		int count=0;                                                //count用来记录分糖果的次数
		boolean b=true;
		while(Same(tang)==false){
			int m=tang[9];         //先把第一个人手里的糖果存起来,防止被覆盖
			for(int i=9;i>0;i--){      //分糖果
				tang[i]=tang[i]/2+tang[i-1]/2;
			}
			tang[0]=tang[0]/2+m/2;     //第一个小孩分糖果
			count++;
			System.out.println("第"+count+"次分之后结果:");
		    print(tang);
		    for(int i=0;i<10;i++)      //如果是奇数,要一个糖果
		    	if(tang[i]%2!=0)
		    		tang[i]+=1;
		}
		System.out.println("分糖果次数:"+count);
		System.out.println("每个人最终糖果个数:"+tang[0]);
		long end = System.currentTimeMillis();
		System.out.println("耗时"+(end-begin)+"ms");
	}
	//输出每次分糖的结果
    private static void print(int[] tang) {
    	if(tang==null){
    		System.out.println("Array==null!");
    	}
		for(int i=0;i<tang.length;i++){
			 System.out.print(tang[i]+"   ");
		}
		System.out.println();
	}
	//判断每个人的糖果是否相等
	private static boolean Same(int[] tang) {
		int n=0;
		boolean b=false;
		for(int i=0;i<tang.length-1;i++){
			if(tang[i]==tang[i+1]){
				n++;
			}
			if(n==tang.length-1){         //如果所有人的糖果数量一样,则判断为真,结束
				b=true;
			}
		}
		return b;
	}
}
运行结果:

第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   
分糖果次数:16
每个人最终糖果个数:18
耗时3ms



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值