首页 > 试题广场 >

斐波那契数列

[编程题]斐波那契数列
  • 热度指数:3472 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

菲波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数K,要求菲波那契数列中第k个数是多少。


输入描述:
输入一行,包含一个正整数k。(0<k<47)


输出描述:
输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小
示例1

输入

19

输出

4181

矩阵乘法解决,保证时间复杂度为O(logN)

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        int n = k - 2;
        if (n <= 2) {
            System.out.println(1);
            return;
        }

        int[][] matrix = new int[][]{{1, 1}, {1, 0}};
        matrix = matrixPower(matrix, n);
        int result = matrix[0][0] + matrix[1][0];
        System.out.println(result);
    }

    private static int[][] matrixPower(int[][] m, int n) {

        int[][] result = new int[m.length][m[0].length];
        for (int i = 0; i < m.length; i++) {
                result[i][i] = 1;
        }

        while (n != 0) {
            result = (n & 1) == 1 ? matrixMultiply(result, m) : result;
            m = matrixMultiply(m, m);
            n >>= 1;
        }

        return result;
    }

    private static int[][] matrixMultiply(int[][] a, int[][] b) {
        if (a[0].length != b.length)
            return null;

        int[][] result = new int[a.length][b[0].length];
        for (int row = 0; row < a.length; row++) {
            for (int column = 0; column < b[0].length; column++) {
                int temp = 0;
                for (int i = 0; i < a[row].length; i++) {
                    temp += a[row][i] * b[i][column];
                }
                result[row][column] = temp;
            }
        }

        return result;
    }
}
发表于 2019-04-24 15:27:35 回复(0)

问题信息

上传者:小小
难度:
1条回答 4779浏览

热门推荐

通过挑战的用户

查看代码