1. 程式人生 > >java 求斐波那契數列 不死神兔

java 求斐波那契數列 不死神兔

 有一對兔子,從出生起後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子, 假如兔子都不死,問第二十個月的兔子對數為多少?
規律: 1,1,2,3,5,8,13...
規則:A.從第三個月開始,第一項是前兩項之和。 
     B.說明前兩項是已知的。

其實就是斐波那契數列,斐波那契數列增長的特別快,計算第20個值,什麼方法都可以,但計算第20億個值,我暫時只知道矩陣快速冪做,而且求的是某個數的餘數,如果想得到精確值,得用BigInteger

public static void main(String[] args) {
		long num1 = 1;
		long num2 = 1;
		Scanner sc = new Scanner(System.in);
		long num = sc.nextLong();//第num個月兔子總數
		long numPrint = num;
		long[][] matrix = {{1,1},{1,0}};//乘積矩陣
		long num3 = 87654321L;//求第num個月兔子總數對num3的餘數
		//矩陣快速冪
		long[][] matrResult = {{1,0},{0,1}};
		num -= 2;//求第3個月兔子總數,只需求矩陣1次方,同理第num個月需求矩陣num-2次方
		while(num>0){
			if((num&1)==1){
				matrResult = matrMulti(matrResult,matrix,num3);
			}
			matrix = matrMulti(matrix,matrix,num3);
			num >>= 1;
		}
		System.out.println("第"+numPrint+"個月兔子總數為"+num3+"的餘數是"+(matrResult[0][0]+matrResult[0][1])%num3);
	}

	private static long[][] matrMulti(long[][] matrResult, long[][] matrix,long num3) {
		int n=2,m=2;//n*m矩陣
		long[][] matrix2 = new long[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				for (int j2 = 0; j2 < m; j2++) {
					matrix2[i][j] +=matrResult[i][j2]*matrix[j2][j] %num3;
				}
			}
		}
		return matrix2;
	}

input:123456789987654321
output:第123456789987654321個月兔子總數為87654321的餘數是42542071