標題:分糖果
有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲:
每個小朋友都把自己的糖果分一半給左手邊的孩子。
一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。
反覆進行這個遊戲,直到所有小朋友的糖果數都相同爲止。
你的任務是預測在已知的初始糖果情形下,老師一共需要補發多少個糖果。
【格式要求】
程序首先讀入一個整數N(2<N<100),表示小朋友的人數。
接着是一行用空格分開的N個偶數(每個偶數不大於1000,不小於2)
要求程序輸出一個整數,表示老師需要補發的糖果數。
例如:輸入
3
2 2 4
程序應該輸出:
4
解題思想:接受輸入數據,調用方法f(),運用遞歸的方法,模擬一輪一輪的分糖過程,並在所有人的糖果數相同的情況下打印結果退出遞歸。
<java>
import java.util.Scanner;
public class B14_8 {
public static boolean test(int[] arr){
int n = 0;
for(int i=1; i<arr.length; i++){ //***注意:i=0;i<length 就是arr[0]--arr[length],但是arr[length]是越界的!!!!***
if(arr[i-1] != arr[i]){ //所以,在用 i=0;i<length 時,注意內部循環體的數組最大爲arr[length-1]
n=1;
break;
}
}
if(n == 1) return false;
else return true;
}
public static void f(int[] arr,int count){
if(test(arr)){//arr所有元素相同
System.out.println(count);
return;
}
int[] b = new int[arr.length];//緩存數組
b[arr.length - 1] = arr[arr.length - 1]/2 + arr[0]/2;
for(int i=0; i<arr.length-1; i++){
b[i] = arr[i]/2 + arr[i+1]/2;//先分一半給左手邊
}
/*
b[i-1] = b[i-1] + arr[i]/2;
b[i-2]
...
b[0] = arr[0] + arr[1]/2
*/
for(int j=0; j<arr.length; j++){
if(b[j] % 2 == 1){
b[j]++; //如果是奇數,補發一個
count++;
}
arr[j] = b[j]; //轉移數據
}
f(arr,count);
}
public static void main(String[] args) {
//N 小朋友
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] arr = new int[N];
for(int i=0;i<N;i++){
arr[i] = sc.nextInt();
}
f(arr,0);
}
}
</java>