c语言矩阵算法斐波那契数列,听说求斐波那契数列,可以用矩阵的方法??

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

k阶斐波那契数列的第k项的值。

常见的是2阶斐波那契数列。

例如: f[n]=f[n-1]+f[n-2]+f[n-3] 是三阶。

矩阵二分算法如下(JAVA代码,大数运算):

import java.math.BigInteger;

import java.util.*;

/**

Title: 

*

Description: 

*

Copyright: Copyright © 2008

*

Company: 

*

* @author not attributable

* @version 1.0

*/

public class fib {

private static BigInteger a[][]  , b[][] ;

/***

* 功能:        矩阵乘法,x = x*y;

* 输入:        x, y 为矩阵,n是矩阵的维数:n*n。

* 时间复杂度:  O(n^2)

* 空间复杂度:  0(n^2)

*/

private static void mul(BigInteger x[][], BigInteger y[][], int n)

{

BigInteger sum = new BigInteger("0");

BigInteger tmp[][] = new BigInteger[n][n];

for(int i =0 ;i 

for(int j =0 ; j 

sum = BigInteger.ZERO;

for(int k =0 ; k 

sum = sum.add( x[i][k].multiply( y[k][j]) );

}

tmp[i][j] = sum;

}

}

a = tmp;

return ;

}

/***

* 功能: 初始化矩阵a

* 输入:  n是矩阵的维数:n*n。

*/

private static void init(int n)

{

a=  new BigInteger[n][n];

b = new BigInteger[n][n];

for(int i =0 ; i 

for( int j =0 ; j 

if(i == j+1 ){

a[i][j] = BigInteger.ONE;

}else{

a[i][j] = BigInteger.ZERO;

}

}

a[i][n-1] = BigInteger.ONE;

}

b = a ;

return ;

}

/***

* 功能:      计算n阶斐波那契序列第k项值;

* 输入:       n , k 如上。

* 时间复杂度: O( log(k) * n^2 )

* 空间复杂度: 0( n^2 )

*/

private static void fib(int n , int k){

if(k == 1 ) return ;

fib(n,k/2);

mul(a,a,n);

if(1 == k%2 ){

mul(a,b,n);

}

return;

}

public static void  main(String args[]) {

Scanner cin = new Scanner(System.in);

while(true){

int n = cin.nextInt(),k = cin.nextInt();

init(n);

fib(n,k);

System.out.println(a[0][n-1]);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值