RT,该怎么求呢?
首先,你可能会想到,顺序遍历求解。
利用通项公式,可以得到斐波那契序列:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34…
那每一项的最后一位就是:
0, 1, 1, 2, 3, 5, 8, 3, 1, 4…
这样做的效率是线性的,N如果上亿就很吃力了。
那么,你很快就会想到,利用斐波那契矩阵求解。
这样做的效率是log(N),但实现起来略微麻烦。
对于斐波那契数列每一项的最后一位,有没有一个固定的模式呢?
答案是有的!
事实上,从第一项开始,每60个序列元素构成一个循环周期。
也就是说,规律像这样:
0, 1, 1, 2, 3, 5, 8, 3, 1, 4…(60项)…0, 1, 1, 2…
那不就很好实现了吗?
下面我给出了JavaScript的解法。
N从第1项开始,没有考虑第0项喔!
var sequence = [];
var a = 1;
var b = 1;
for(var i=1;i<=60;i++){
sequence.push(a);
var temp = (a + b) % 10;
a = b;
b = temp;
}
function lastFibDigit(n){
return sequence[n % 60 - 1];
}