讀《海洋測繪十年》序言
阿新 • • 發佈:2021-12-16
斐波那契數,通常用F(n) 表示,形成的序列稱為 斐波那契數列 。該數列由0 和 1 開始,後面的每一項數字都是前面兩項數字的和。也就是:
F(0) = 0,F(1)= 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
給你 n ,請計算 F(n) 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/fibonacci-number
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
快速冪
import java.util.Scanner; class Solution { // f(3), f(2) = f(2), f(1) (1, 1) // (1, 0) // f(4), f(3) = f(3), f(2) (1, 1) // (1, 0) private int[][] multiply(int[][] a, int[][] b) { int[][] ret = new int[a.length][b[0].length]; for (int i = 0; i < a.length; ++i) { for (int j = 0; j < b[0].length; ++j) { for (int k = 0; k < a[0].length; ++k) { ret[i][j] += a[i][k] * b[k][j]; } } } return ret; } public int fib(int n) { int[][] base = { {1, 1}, {1, 0} }; int[][] ret = { {1, 0} }; while (n > 0) { if ((n & 1) == 1) { ret = multiply(ret, base); } n >>= 1; base = multiply(base, base); } return ret[0][1]; } public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { System.out.println(new Solution().fib(in.nextInt())); } } }
公式
class Solution {
public int fib(int n) {
double sqrt5 = Math.sqrt(5);
double fibN = Math.pow((1 + sqrt5) / 2, n) - Math.pow((1 - sqrt5) / 2, n);
return (int) Math.round(fibN / sqrt5);
}
}
心之所向,素履以往 生如逆旅,一葦以航