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
 

猜你喜欢

转载自blog.csdn.net/weixin_40101530/article/details/84141653
今日推荐