如題,我們這一次要試著設計出,能夠計算出費波納契數加總的尾數輸出,我原本用了大數相加方式,但在輸入值為8萬多時,就爆掉了,所以我查詢了網路,一直冒出來一個關鍵字:
我在這裡簡潔說明一下原理,費波納契數是一個無止盡的數字,然而,若跟指定整數相除,留下來的餘數會出現規律,稱為Pisano period。
例如,將費波納契數與3相除的餘數,依序如下:
[0, 1, 1, 2, 0, 2, 2, 1]... ....然後就一直重複下去
若將費波納契數相加後與3相除的餘數,依序如下:
[0, 1, 2, 1, 1, 0, 2, 0]... ...然後就一直重複下去
以上我們發現一個共通點,按照 Pisano period,不管是費波納契數還是費波納契數加總,相應整數的餘數週期是一致的,例如與3的餘數週期,都是8循環一次。
然後,由於我們題目要求找出尾數,那麼使用費波納契數加總與10的餘數週期就能找到解答,查詢網路得知,10的餘數週期是60,並且使用費波納契數加總,程式輸出前60的,10餘數依序如下:
{0,1,2,4,7,2,0,3,4,8,
3,2,6,9,6,6,3,0,4,5
,0,6,7,4,2,7,0,8,9,8
,8,7,6,4,1,6,8,5,4,0
,5,6,2,9,2,2,5,8,4,3,
8,2,1,4,6,1,8,0,9,0}
那麼,在參考許多程式後,我的程式如下:
#include<iostream>
using namespace std;
long long last_fibo_digit(long long n) {
int period;
int fibo_pisa[60]=
{0,1,2,4,7,2,0,3,4,8,
3,2,6,9,6,6,3,0,4,5
,0,6,7,4,2,7,0,8,9,8
,8,7,6,4,1,6,8,5,4,0
,5,6,2,9,2,2,5,8,4,3,
8,2,1,4,6,1,8,0,9,0};
period = n%60;
return fibo_pisa[period];
}
int main(){
long long int n;
cin>>n;
cout<<last_fibo_digit(n)<<endl;
return 0;
}
結果: