Nim遊戲的規則是:spa
1. 有N個石頭(確定大於0不然就無法玩了)code
2. 有兩個玩家(由於就大家兩個好基友)blog
3. 本身先下手(夠腹黑的,嘿嘿)遊戲
4. 每次必須拿1-3個石頭(不能太貪婪)class
5. 最後拿完的算贏(所有都歸最後拿完的那我的,若是石頭是鑽石的話……,這結果會不會致使基友感情破裂?)二進制
經過規則發現了一些訣竅:im
1. 若是輪到本身的時候餘數爲1-3,也就是本身能拿完的時候就贏了;di
2. 若是留給對方的是4個,不管對方怎麼拿最終留給本身的老是能一次拿完;相反,你要是獲得4個,那你就輸了;co
3. 做爲腹黑的你確定要千方百計讓對方留給你1-3個,或者儘量的留給對方4個;return
4. 只要留給本身的不是4的整數倍,本身就能贏(拿完者贏),由於只要本身不是4的整數倍,本身就能讓對方一直變成4的整數倍。
因此方案就是:
本身要儘量的讓對方拿石子以前變成4的整數倍,而本身決不能出現這種狀況;
本着雙方都是有着愛因斯坦般聰明無比的原則,顯然輪到本身時剩餘量爲4的整數倍本身就輸了;
代碼
1 return ((n % 4) != 0); // 若是除以4求餘結果不是0說明不是4的整數倍 2 return ((n & 0b11)!=0); // 0b11是二進制3的意思,這裏是位與,至關於保留最後兩個比特,若是結果不是0說明不是4的整數倍 3 return ((n >> 2 << 2) != n); // n右移兩位再左移兩位若是不能和原來的數相同,說明右移丟失的2個比特不是0,這也證實了不是4的整數倍