java 求斐波那契數列 不死神兔
阿新 • • 發佈:2018-12-21
有一對兔子,從出生起後第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