您的位置:首页 > 其它

Fibonacci数列

2012-03-18 11:56 183 查看
第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
;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: