iT邦幫忙

0

Day 19, 費波納契數加總,求尾數輸出值: 背後的數學規律

  • 分享至 

  • xImage
  •  

如題,我們這一次要試著設計出,能夠計算出費波納契數加總的尾數輸出,我原本用了大數相加方式,但在輸入值為8萬多時,就爆掉了,所以我查詢了網路,一直冒出來一個關鍵字:

Pisano period

我在這裡簡潔說明一下原理,費波納契數是一個無止盡的數字,然而,若跟指定整數相除,留下來的餘數會出現規律,稱為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;
}

結果:
https://ithelp.ithome.com.tw/upload/images/20220622/201495734jhfzEvpRK.png


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言