O(logN)求Fibonacci序列

抄自编程之美,太经典了

主要要注意千万不能随便new对象,因为开销太大

所以从头到位之构造了两个对象r和t


#include<iostream>
#include<stdlib.h>
using namespace std;
class M
{
	public:
	M(int a11,int a12,int a21,int a22)
		:a11(a11),a12(a12),a21(a21),a22(a22)
	{
	}
	M& operator*(M& H)//额。。。。这个函数明显处理的有点不好,不过不影响正确性
	{
		if(this!=&H)
		{
			b11=a11;b12=a12;b21=a21;b22=a22;
			a11=b11*H.a11+b12*H.a21;
			a12=b11*H.a12+b12*H.a22;
			a21=b21*H.a11+b22*H.a21;
			a22=b21*H.a12+b22*H.a22;
			return *this;
		}
		else
		{
			b11=a11;b12=a12;b21=a21;b22=a22;
			c11=a11;c12=a12;c21=a21;c22=a22;
			a11=b11*c11+b12*c21;
			a12=b11*c12+b12*c22;
			a21=b21*c11+b22*c21;
			a22=b21*c12+b22*c22;
			return *this;
		}
	}
	int b11;
	int b12;
	int b21;
	int b22;
	
	int c11;
	int c12;
	int c21;
	int c22;
	
	int a11;
	int a12;
	int a21;
	int a22;
	
};

int Fibonacci(int N)
{
	M r(1,0,0,1);
	M t(1,1,1,0);
	while(N>0)
	{
		if(N%2==1)//odd
			r=r*t;
		t=t*t;
		N=N/2;
	}
	return r.a11;
}

int main()
{
	while(1)
	{
		int i;
		cin>>i;
		cout<<Fibonacci(i)<<endl;
	}
	return 0;
}


你可能感兴趣的:(编程,c)