某取数问题的递推解法

杯具啊,听说是数论的题,可惜不会数论,

只能用递推法给出一个范围内的结果,原题如下:

对于任意整数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支持

上代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值