您的位置:首页 > 编程语言 > C语言/C++

Fibonacci 数列

2016-03-24 16:13 369 查看
方法一、使用递归的方法 求斐波那契第n项!

这种方法虽然代码看起来简单,但是,效率非常低。因为在递归求解的过程中重复计算。

long long Fibonacci(unsigned int n)
{
if(n <= 0)
return 0;
if(n == 1)
return 1;

return Fibonacci(n-1) + Fibonacci(n-2);
}


方法二、使用循环的方法,循环的方法可以避免重复计算。

long long Fibonacci(unsigned int n)
{
int result[2] = {0,1};
if(n < 2)
return result
;

long long fibNMinusOne = 1;
long long finNMinusTwo = 0;
long long fibN = 0;

for(int i = 2; i <= n; ++i)
{
fibN = fibNMinusOne + finNMinusTwo;

finNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}

return fibN;
}


方法三、使用矩阵快速幂 求斐波那契第n项!

#include <iostream>
#include <cstring>

using namespace std;

struct mat {
long long m[2][2];
mat()
{
memset(m, 0, sizeof(m));
}
};

int n=2;

mat operator * (mat a, mat b)
{
mat c;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
for(int k=0; k<n; k++)
c.m[i][j] += (a.m[i][k] * b.m[k][j]) % 1000000007; //记得模
return c;
}

void print(mat a)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout << a.m[i][j] << " ";
cout << endl;
}
}

int main()
{
int t;
while(cin >> t)
{
if(t == -1)
break;
mat a;
mat c;
c.m[0][0] = 1; c.m[0][1] = 0; c.m[1][0] = 0; c.m[1][1] = 1;
a.m[0][0] = 1; a.m[0][1] = 1; a.m[1][0] = 1; a.m[1][1] = 0;
int N = t;
while(N)
{
if(N%2)
c = c * a;
a = a * a;
N /= 2;
}
cout << c.m[0][1]%1000000007 << endl;
}

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