使用了二分法
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;
}
}
原文:http://blog.csdn.net/u010786672/article/details/44678769