某取數問題的遞推解法

杯具啊,聽說是數論的題,可惜不會數論,

只能用遞推法給出一個範圍內的結果,原題如下:

對於任意整數n, 有甲乙兩個人,每個人可以從n中取出6的次方個數,比如1,6,36,216。。。。,
比賽規則爲:甲先取,誰最後將數取到0便爲勝者。
注: 假設甲乙都都以最優化方式取數。
問: 給定任意整數n,設計算法計算出誰會是最後的勝者

這個題估計是以前看過某題的升級版,
某題大意是這樣的:
一堆石頭,兩個人輪流取,每次可取1 2 3 4 5中的某一個數塊,
不能不取,也不能多取,
取到最後一堆者爲贏
給定石頭數n,問先取者有無必須策略
答案爲如果石頭數爲6的整數倍,
則後取者必贏(先取者取k個,則後取者取6-k個就可以保證贏)
如果石頭數爲非6的整數倍,
則先取者必贏(先取k個石頭使石頭數變爲6的整數倍,轉化爲後取者必贏的局面)
這個轉化的思想比較重要,
對於這個問題,估計數論專家會有理論上的解答。。。
這裏用程序的遞推+轉化的思想可以解決某一整數範圍內的問題,
但對於必勝的局面,沒有給出具體的取法。。。
具體的做法是從1開始,依次分析。記(k,贏)爲整數爲k時,先取者必贏
則前幾個的結果爲
(1,贏),(2,輸),(3,贏),(4,輸),(5,贏),(6,贏),(7,輸),(8,贏)
以這幾個結果向後遞推,
方法如下:
對於某整數n,從1到n-1的結果已經給出,
下面做法如下:
先找出最大的6的k次方小於n的數k,
然後從m屬於{1,6,...,6^k}檢查,
看n-m的結果是先取者必贏還是必輸,
如果有一個結果是先取者必輸,
那麼對於整數n的結果就是先取者必贏,否則必輸,
依次類推就行了,
不說了,上代碼,
最後結果爲true表示先取者必贏,false表示先取者必輸,
不清楚這個結果正確不。。。
上代碼:
需要1.4以上的jdk支持

上代碼:

發佈了53 篇原創文章 · 獲贊 12 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章