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 ; }