【算法】爱因斯坦台阶问题一步解决

问题描述

爱因斯坦曾经提出过这样一道有趣的数学题:有一个长阶梯,若每步上2阶,最后剩下1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩下4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩。请问该阶梯至少有多少阶。

解决方法

1 以1为单位向上穷举尝试

没啥好说的
pass

2 以7为单位向上穷举尝试

也没啥东西
pass

3 以30为单位向上穷举尝试

30为2,3,5,6的最小公倍数
30 * n - 1可以满足除以2,3,5,6时都差1才能整除
当30 * n - 1同时也满足被7整除时即可
n穷举递增
大部分答案都是用这种解法
相似的书里还有以1、2、4、5的最小公倍数向上加的
为什么可以用20来加其实我没想明白,有懂的小伙伴希望能评论区为我解惑一下谢谢

4 总结公式,一步解决

就像有了高斯求和的公式,于是一步解决了等差数列求和一样
爱因斯坦台阶问题也可以总结公式,一步解决
其实只要想到了第三种解法,第四种解法也就直接出来了,我不明白为什么算法书里没有提到
30 mod 7 = 2 (每个最小公倍数30提供2个单位)
( 7 + 1 ) / 2 = 4 (共需要4个30才能累计获得8个单位余量,即-1单位便可被7整除)
n = 30 * 4 - 1 = 119 (可以满足与30的公倍数差1,也可以满足-1便可被1整除)

拓展思考

等差数列求和是对一般化问题的解决方案
而第四种方法,也即总结得出的公式相信你也看出来了,它也是一种一般化问题的解决方案,也即任意一个爱因斯坦台阶问题都可以用公式一步解决,下面我们来简单说一下

1 问题抽象

给出一个严格递增的X[N]数组,其中第N种迈法可以刚好圆满。而前面的N-1种中,任意一种迈法,其策略是迈出step=k步都会余下k-1阶楼梯。
即,问题转化为根据一个任意长的严格递增数组,求出一个数字,使其可以被数组的最后一项整除,并且满足其+1便能被前面所有数整除。

2 问题解决

(伪代码)
//根据公式法,求出前n-1个数最小公倍数(X[n-1]是指数组)
num = gcd(Array X[n-1])
//每个num可以提供多少单位量(X[n]是指第n个数字值)
give = num mod Int X[n]		
//同方法4中的分析
n = num * (X[n] + 1) / give - 1

3 其他内容

一般算法书里只是对某种特定问题的思考与解决,比如最前面给出的经典爱因斯坦台阶问题。这种特定问题答案太简单了,一步就能算出来,无需多想。
但是如果想将简单的公式推广,那就一定要注意在一般问题中可能会冒出的各种各样的异常,避免bug。
比如数组中会不会给重复数字,会不会不是严格递增,会不会num mod IntX[n]刚好整除了导致除数为0的异常。
所以如果想用公式写个方法解决这类的所有一般问题,还需要思考对特殊输入值的具体处理方法。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值