矩阵实现,时间复杂度为(lgn)
void feng(int a2,int a1,int a0,int b2,int b1,int b0,int& c2,int& c1,int& c0)
{
c2 = a2*b2+a1*b1;
c1 = a2*b1+a1*b0;
c0 = a1*b1+a0*b0;
}
void getfib(int n,int& c2,int& c1,int& c0)
{
if(n<2)
{
c2 = 1;
c1 = 1;
c0 = 0;
return;
}
int i =n/2;
getfib(i,c2,c1,c0);
feng(c2,c1,c0,c2,c1,c0,c2,c1,c0);
if(0 != n%2)
{
feng(c2,c1,c0,1,1,0,c2,c1,c0);
}
}
int GetFibonacciNumber(int n)
{
if(0==n) return 0;
int a,b,c;
getfib(n,a,b,c);
return b;
}
线程递增实现,时间复杂度为(n)
int GetFibonacciNumber(int n)
{
int a = 0;
int b = 1;
for(int i = 2;i<=n;i=i+2)
{
a = a+b;
b = a+b;
}
return 0 == n%2 ? a:b;
}