【C#】 迴圈小練習_分糖果

重複分配,透過迴圈修正陣列數,達到相等。

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顆
另外小朋友手上沒有糖果時,該不該跟老師要一顆??
最後同事告訴我,有時候簡單的事你複雜化了就會很痛苦,但你不考量全面,程式就會出現漏洞(臭蟲)。
複雜有複雜解,練習就通曉概念就好................

但是心中那關過不去啊。

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。