Fibonacci数列

第19题(数组、递归):
题目:定义Fibonacci数列如下:  
  / 0 n=0
f(n)= 1 n=1
  / f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n项。
//coder:LEE
//20120315
#include<iostream>
#include<cassert>


using namespace std;
class A
{
int data[2][2];
public:
void initdata();
A& operator*(const A& a);
friend void print(A a);
int GetFn();
};
void A::initdata()
{
data[0][0]=1;
data[0][1]=1;
data[1][0]=1;
data[1][1]=0;
}
int  A::GetFn()
{
return data[1][0];
}
A& A::operator*(const A& a)
{
int x=data[0][0]*a.data[0][0]+data[0][1]*a.data[1][0];
int y=data[0][0]*a.data[0][1]+data[0][1]*a.data[1][1];
int z=data[1][0]*a.data[0][0]+data[1][1]*a.data[1][0];
int h=data[1][0]*a.data[0][1]+data[1][1]*a.data[1][1];
data[0][0]=x;
data[0][1]=y;
data[1][0]=z;
data[1][1]=h;
return *this;


}
A ComputerA(int n,A &a)//避免a*a,否则会改变a的值
{
assert(n>0);
if(n==1)
return a;
else if(n%2==0)
{
A x=ComputerA(n/2,a);
return x*x;
}
else
{
A y=ComputerA((n-1)/2,a);
return a*y*y;
}


}
void print(A a)
{
cout<<a.data[0][0]<<" "<<a.data[0][1]<<endl;
cout<<a.data[1][0]<<" "<<a.data[1][1]<<endl;
}
int Fibonacci_Solution1(int n)
{
if(n==0)
return 0;
if(n==1)
return 1;
return Fibonacci_Solution1(n-1)+Fibonacci_Solution1(n-2);


}
int Fibonacci_Solution2(int n)
{
int fn[2]={0,1};
int f=fn[n];
for (int i=2;i<=n;i++)
{
f=fn[0]+fn[1];
fn[0]=fn[1];
fn[1]=f;
}
return f;
}
//{f(n), f(n-1), f(n-1), f(n-2)} ={1, 1, 1,0}n-1,问题转换为求矩阵{1, 1, 1, 0}的乘方。
int Fibonacci_Solution3(int n)
{
A a;
a.initdata();
A b=ComputerA(n,a);
// print(b);
return b.GetFn();
}
int main()
{
int n=6;
cout<<"solution1:"<<Fibonacci_Solution1(n)<<endl;
cout<<"solution1:"<<Fibonacci_Solution2(n)<<endl;
cout<<"solution1:"<<Fibonacci_Solution3(n)<<endl;
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值