学递归递推的孩子们碰壁了?(猜你肯定没注意到标签中的 高精度 )
首先,学递归你肯定学过 斐波那契数列 ,这道题就是 ... 嗯嗯,对,只是包装了一下,说直白点,ze TM 就是啊!(哦齁齁齁齁齁!)
没学过?(先去学了再来做这道题吧)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这道题输入5000,答案是:627630280048895708603525310...70626
满打满算总共1245位数(这你敢不用高精度?)
(现在看看本题解代码,觉得简单看楼上 详情请看此题解:楼上的题解 矩阵快速幂)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
说那么多废话,接下来进入我的思路 (啥子思路,可以不看)
一开始我注意到了这道题的范围,点开了算法标签——好家伙,果真是高精度!
这里我运用递推的方式,我的代码主要部分其实就是记忆化思想,
没错,a[i-1]代表前面第一个楼梯到达方式个数,a[i-2]代表前面第二个楼梯到达方式个数,a[i]代表本级台阶到达方式个数
很显然,1245位数,long long也存不下。
好消息,高精度...废话,高精度本身就可以
高精度引入
由于空间问题,我们在处理一些大数运算时就连常用的long long也变得招笑:区区64位数,存的下我1245位数?简直就是 区 一般的存在。于是,聪明的入类想出了一个巧妙的算法——高精度!高精度简单来说就是用一个数组来存一个数。这听起来是不是很意外?一个数组这么大的空间,来存那么小一个数?实则不然,用这个数组存的数可以到达百位数,甚至是千位,万位,还能更高。他的便是将这个数个位存在这个数组的零号位,十位存在这个数组的一号位,以此类推。因此,数组开多大,这个数就可以有多少位数,甚至更多。
在小学。我们学习了一个古老的计算方式——竖式。没错,高精度的运算本质上就是竖式
加法就是从个位至最高位依次计算,并处理进位。同样的,高精度从数组中存储的最低位至最高位依次计算,并处理进位。
同理,减法就是从个位至最高位依次计算,并处理借位。同样的,高精度从数组中存储的最低位至最高位依次计算,并处理借位。
再同理...乘法除法亦是如此,这就是高精度的简单运算。
下面是完整代码,看完我的思路建议自己写一遍,不要着急抄。
祝你今后在题目分析上更进一步,(看算法标签是一个方法,没有还不是要你自己分析啊喂!)