首页 > 编程语言 > 详细

斐波那契数列的矩阵解法(java实现)

时间:2015-03-27 17:24:45      阅读:172      评论:0      收藏:0      [点我收藏+]

使用了二分法

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();
			int[][] m = fb(n);
			long t1 = System.currentTimeMillis();
			System.out.println(m[0][1]);
			long t2 = System.currentTimeMillis();
			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实现)

原文:http://blog.csdn.net/u010786672/article/details/44678769

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!