Fibonacci數列求解

2021-08-15 14:58:04 字數 1784 閱讀 9512

問題描述

fibonacci數列的遞推公式為:fn=fn-1+fn-2,其中f1=f2=1。

當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。

輸入格式

輸入包含乙個整數n。

輸出格式

輸出一行,包含乙個整數,表示fn除以10007的餘數。

說明:在本題中,答案是要求fn除以10007的餘數,因此我們只要能算出這個餘數即可,而不需要先計算出fn的準確值,再將計算的結果除以10007取餘數,直接計算餘數往往比先算出原數再取餘簡單。

樣例輸入

10 樣例輸出

55 樣例輸入

22 樣例輸出

7704

資料規模與約定

1 <= n <= 1,000,000。

求解

no.1

看到題目我最先想到的就是採用遞迴求解,解法如下:

public

static

void

main(string args)else

}private

static

intfibonacci(int n)else

}

很不幸,30分結果如下:

仔細想了想,原因應該是這樣的:

採用遞迴太佔記憶體,在遞迴的過程中,進行了很多無用操作。比如算f(5),會遞迴到f(3)和f(4),而f(4)又會遞迴到f(3),這樣f(3)就算了兩次,f(2),f(1)算的次數更多,然後就變成指數級的複雜度了,所以只要加上乙個f陣列,記錄下f的值,使得每個f只要計算一次。就可以通過了。

於是進行了第二次嘗試。

no.2

第二次採用陣列,for迴圈解決,**如下:

public

static

void

main(string args)else

system.out.println(fibonacci[a - 1] % 10007);}}

然而結果還是30分,而且第三次以後的測試資料結果竟然都報錯!!!

思前想後,再加上度娘的幫助,找到了如下原因:

本次運算為超精度計算,先計算再求餘的話,如果輸入的值比較大,它計算出來的值可能已經超出整形的取值範圍,因此必然會導致兩個問題——溢位和超時!!!

於是,我進行了三次嘗試。

no.3

吸取教訓,先求餘再接著計算(其實題目裡都提示過了,自己太不當回事),**如下:

public

static

void

main(string args)else

system.out.println(fibonacci[a - 1]);

}

}

很開心,滿分

這是做藍橋杯的第一道入門題,雖然簡單,但自己答起來去很費力。繼續努力吧!

感謝各路大神的部落格!

Fibonacci(斐波納契)數列求解 zz

unsigned long fib int n else 遞迴演算法與定義公式十分吻合,容易理解,但計算過程存在大量重複的運算,時間複雜度達到了o 2 n 使用的記憶體空間也隨著函式呼叫棧的增長而增長。這顯然不適於實用的程式。2 表驅動的遞迴法。這裡不提純粹的表驅動法,因為對於項數未知的fibona...

Fibonacci數列三種方式求解及其複雜度分析

目錄 一 遞迴求解 複雜度分析 解法缺點 二 解決重複計算方式 思路 時間複雜度 三 利用數學公式o logn 解法 o n 解法 o logn 解法 public static int fibonacci int x 設f n 為引數為n時的時間複雜度,很明顯 f n f n 1 f n 2 這就...

計算Fibonacci數列

上機內容 用動態分配空間的方法計算fibonacci數列的前30項並儲存到動態分配的空間中 上機目的 學習fibonacci數列演算法 我的程式 includeusing namespace std void main int p new int 30 p 1 p 1 1 cout p p 2 fo...