这篇文章讲述的是算法初级部分的分糖果问题的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