题目:定义Fibonacci数列如下:
/ 0 n=0
f(n) 1 n=1
\ f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n项。
分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。
最快当然是矩阵快速幂了
{fn,fn-1} * {1,1} = {fn+fn-1,fn}
1,0
不懂矩阵快速幂可以先看指数快速幂
#pragma warning(disable:4996)
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define N 1005
int ans[] = { 1,0 };
int matrix[][2] = { 1,1,1,0 };
void CalMatrix()
{
int midMatrix[2][2];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) midMatrix[i][j] = matrix[i][j], matrix[i][j] = 0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j <2; j++)
{
for (int k = 0; k < 2; k++)
{
matrix[i][k] += midMatrix[i][j] * midMatrix[j][k];
}
}
}
}
void Solve(int n)
{
while(n)
{
if(n%2 == 0)
{
CalMatrix();
}
else
{
int midAns[2] = { ans[0],ans[1] };
ans[0] = ans[1] = 0;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
{
ans[j] += midAns[i] * matrix[i][j];
}
}
CalMatrix();
}
n /= 2;
}
}
int main()
{
#ifdef local
freopen("data.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
if (n == 0) cout << 0 << endl;
else if (n == 1) cout << 1 << endl;
else
{
n--;
Solve(n);
cout << ans[0] << endl;
}
}