1. 程式人生 > >計算Fibonacci的第5000項

計算Fibonacci的第5000項

Fibonacci數列

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2)(n>=4,n∈N*)。(引用自百度百科)

如何實現

實現該問題的關鍵點在於如何將第5000項存下來? 通過計算,第5000項大概有超過1000位數。這裡我們用兩種方式來解決。

  1. 將數用陣列來表示,進行加減。
  2. 使用Java語言提供的BigInteger類來實現。

程式碼如下:

import java.math.BigInteger;
public class Demo {
    //用陣列來是實現。該函式返回的是Fibonacci的第1項到第N項(以字串表示)
    public static StringBuilder[] FibonacciByArray(int N){
        //Fibonacci的第5000項大約有1150位,故初始化為陣列為int[5001][1101]
        int[][] temp = new int[5001][1101];
        temp[1][1100] = 1;
        temp[2][1100] = 1;
        //temp[3][1100] = 2;
        for (int i = 3; i <= N; i++) {
            for (int j = 1100; j >=0 ; j--) {
                //如果相加大於10就進位
                if(temp[i - 1][j]+temp[i - 2][j] >= 10){
                    temp[i][j - 1] =temp[i][j - 1] + 1;
                }
                temp[i][j] = temp[i][j]+(temp[i - 1][j]+temp[i - 2][j])%10;
                //判斷是否進位
                if(temp[i][j] == 10){
                    temp[i][j - 1] += 1;
                    temp[i][j] = 0;
                }
            }
        }
        //對temp陣列進行處理,並轉換成字串。
        StringBuilder[] s = new StringBuilder[5001];
        for (int i = 1; i <= N; i++) {
            int j=0;
            while(temp[i][j]==0)
                j++;
            StringBuilder sb = new StringBuilder();
            for (int k = j; k < 1101; k++) {
                sb.append(temp[i][k]);
            }
            s[i] = sb;
        }
        return s;
    }

    //用BigInteger來實現
    public static BigInteger FibonacciByBigInteger(int n){
        BigInteger bi1 = new BigInteger("1");
        BigInteger bi2 = new BigInteger("1");
        BigInteger bi3 = new BigInteger("-1");
        if(n == 1){
            return bi1;
        }else if(n == 2){
            return bi2;
        }
        for (int i = 3; i <= n; i++) {
            bi3 = bi1.add(bi2);
            bi1 = bi2;
            bi2 = bi3;
        }
        return bi3;
    }
    public static void main(String[] args) {
        int N = 5000;
        for (int i = 1; i <= N; i++) {
            System.out.println("第" + i + "項:"+FibonacciByBigInteger(i));
        }
        StringBuilder[] sbs = FibonacciByArray(N);
        int i = 1;
        for (int j = 1; j <= N; j++) {
            System.out.println("第" + j + "項:"+sbs[j]);
        }
    }
}