题目要求:10个小孩围成一圈分糖果,老师分给第一个孩子10块,第二个小孩2块,后面依次分的糖果数量为10、2、8、22、16、4、10、6、14、20。然后所有的小孩同时将手中的糖果分一半给右边的小孩,糖果为奇数的可向老师要一块。问经过几次后,大家手中的糖果的块数将一样多,每个人有多少糖果。
public class E201_06_06_分糖果 {
public static void main(String[] args) {
int[] t = {10,2,8,22,16,4,10,6,14,20};//十个人每个人有多少糖果
int[] r =new int[10];//用来装糖果用的数组
int j = 0;//计数器,用来记下轮了几次
while (panduan(t)){
//把t数组的糖果分出一半到r数组,t数组每个人弃掉一半
for (int k = 0;k<t.length;k++){
r[k] = t[k]/2;
t[k] = t[k]/2;
}
//把r数组里边的加到t数组里,因为要加到第二个人上所以要斜着加
for (int k = 0; k < t.length-1; k++) {
t[k+1] += r[k];
}
//第一个和最后一个单独写出来,防止数组下标越界
t[0] += r[9];
//判断每个人的糖果是否是偶数,反之加一
for (int k = 0; k < t.length; k++) {
if (t[k]%2!=0){
t[k]+=1;
}
}
j++;
}
System.out.printf("一共分了%d轮",j);
System.out.printf("每人分了%d个糖果",t[0]);
}
/**
* 判断每个人的糖果是否相同
* @param t 要判断的数
* @return 返回true-说明不相同继续发糖果 false-说明相同不用在进行下去
*/
public static boolean panduan(int[] t){
boolean flag = false;
for (int i = 0;i<t.length;i++){
if (t[0]!=t[i]){
flag = true;
}
}
return flag;
}
}