重複分配,透過迴圈修正陣列數,達到相等。
10 個小孩圍成一圈分糖果,老師給了每個人不同的糖果
第1個 24顆
第2個 10顆
第3個 2顆
第4個 8顆
第5個 12顆
第6個 4顆
第7個 6顆
第8個 18顆
第9個 20顆
第10個 6顆
然後,所有的小朋友要將手上的一半糖果傳給右邊的小孩,糖果奇數的可以跟老師要一顆。
請問幾次後大家的糖果數量會一致。
也就是說,只要陣列中的數不相等,迴圈就要持續進行。
然後繼續將數量對分,單數在取得1顆,直到陣列數都相等。
static void Main(string[] args)
{
int[] candy ={24,10,2,8,12,4,6,18,20,6};
int tt = 0; //紀錄分糖果次數
bool b = true;
//如果手上的糖果都不相同,繼續分糖果
while (Issame(candy) == false)
{
int m = candy[9]; // 記錄每次迴圈最後一筆資料
for (int i = 9; i > 0; i--) //迴圈分糖果
{
candy[i] = (candy[i] / 2) + (candy[i - 1] / 2);
}
candy[0] = (candy[0] / 2) + (m / 2); //最後一個小孩分糖果
tt++; //次數加1
Console.Write(string.Format("第 {0} 次分糖的結果:", tt));
Show(candy);
//糖果是奇數的要跟老師要糖果
for (int i = 0; i < 10; i++)
{
if (candy[i] % 2 != 0)
{
candy[i] += 1;
}
}
}
Console.WriteLine("分糖果總次數:{0}", tt);
Console.WriteLine("每人最後糖果數:{0}", candy[0]);
Console.ReadLine();
}
public static bool Issame(int[] a)
{
int n = 0;
bool isok = false;
for (int i = 0; i < a.Length - 1; i++)
{
if (a[i] == a[i + 1]) //如果相鄰兩數相等,則計數器加1
{
n++;
}
if (n == a.Length - 1)//全部都相同
{
isok = true;
}
}
return isok;
}
public static void Show(int[] a)
{
if (a == null) Console.WriteLine("陣列是空值");
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i] + " ");
}
Console.ReadLine();
}
}
實際測試後發現,題目設定不完善,程式碼有瑕疵。
當期初糖果數量為奇數時,會出現糖果抹除的錯誤。
簡單的說,若我有3顆糖,依據題意,要分一半給旁邊..(請問我應該給幾顆??) 1.5顆??(糖果沒有半顆的), 還是2顆 、或者是1顆
另外小朋友手上沒有糖果時,該不該跟老師要一顆??
最後同事告訴我,有時候簡單的事你複雜化了就會很痛苦,但你不考量全面,程式就會出現漏洞(臭蟲)。
複雜有複雜解,練習就通曉概念就好................
但是心中那關過不去啊。
水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。