計算Fibonacci的第5000項
阿新 • • 發佈:2018-12-18
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位數。這裡我們用兩種方式來解決。
- 將數用陣列來表示,進行加減。
- 使用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]); } } }