斐波那契数列的矩阵解法(java实现)
2015-03-27 16:36
423 查看
使用了二分法
import java.util.Scanner; /** * 求斐波那契数列<br/> * <pre> * [F(n+1) F(n)] [1 1 ]^n (n次方,可以使用归纳法证明)<br/> * | | =| | <br/> * [F(n) F(n-1)] [1 0 ] <br/> * </pre> * @author bing * */ public class F { // 关联矩阵 private static final int[][] UNIT = { { 1, 1 }, { 1, 0 } }; // 全0矩阵 private static final int[][] ZERO = { { 0, 0 }, { 0, 0 } }; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (true) { // 第n个斐波那契数,从0开始 int n = scanner.nextInt(); long t1 = System.currentTimeMillis();
int[][] m = fb(n); long t2 = System.currentTimeMillis(); System.out.println(m[0][1]); System.out.println("Time is: " + (t2 - t1)); } } /** * 求斐波那契数列 * * @param n * @return */ public static int[][] fb(int n) { if (n == 0) { return ZERO; } if (n == 1) { return UNIT; } // n是奇数 if ((n & 1) == 0) { int[][] matrix = fb(n >> 1); return matrixMultiply(matrix, matrix); } // n是偶数 int[][] matrix = fb((n - 1) >> 1); return matrixMultiply(matrixMultiply(matrix, matrix), UNIT); } /** * 矩阵相乘 * * @param m * r1*c1 * @param n * c1*c2 * @return 新矩阵,r1*c2 */ public static int[][] matrixMultiply(int[][] m, int[][] n) { int rows = m.length; int cols = n[0].length; int[][] r = new int[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { r[i][j] = 0; for (int k = 0; k < m[i].length; k++) { r[i][j] += m[i][k] * n[k][j]; } } } return r; } }
相关文章推荐
- 斐波那契数列的矩阵分治求法java实现
- java实现斐波那契数列的3种方法
- 递归算法实现斐波那契数列每项值显示(java)
- 斐波那契数列递归与非递归实现(JAVA语言描述)
- java实现斐波那契数列
- 斐波那契数列的3种java程序实现
- 斐波那契数列的实现(java)
- JAVA实现斐波那契数列
- 斐波那契数列解法,矩阵解法,学习
- JAVA 递归与非递归斐波那契数列的实现
- 斐波那契额数列Java实现方法
- Java实现斐波那契数列
- Java实现斐波那契数列并输出前10000个数值
- 斐波那契数列面试题解法(java)
- Java实现斐波那契数列
- java编程:三种方法实现斐波那契数列
- 斐波那契数列 Java实现
- 剑指offer编程题Java实现——面试题9斐波那契数列
- java实现斐波那契数列
- java实现计算斐波那契数列