calculate Fibonacci Num by using Dynamic plan method

来源:互联网 发布:linux 直接回到根目录 编辑:程序博客网 时间:2024/06/14 11:29

/*  
    *filename:   fibonacci.cpp  
    *date:   2006.10.1  
    *created:   karl   zheng  
    *description:   MatrixMultiplication   for   calculate   Fibonacci   No.   n,cost:   logN  
    */  
  #include   <stdafx.h>  
  #include   <stdio.h>  
  #include<iostream>  
  #include   "string.h"  
   
   
  void   MatrixMultiply2By2(int   a[2][2],int   b[2][2],int     c[2][2])  
  {  
   
  //c[1][1]=a[1][1]*b[1][1]+a[1][2]*b[2][1];   //it's   strange:out   bound   but   no   compiler   error   message  
  c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];  
  c[0][1]=a[0][0]*b[1][0]+a[0][1]*b[1][1];  
  c[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0];  
  c[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1];  
  }  
  void   MatrixMultiply2By2_n_times_Power(int   a[2][2],int   n,int     c[2][2])  
  {  
  int   temp[2][2];  
   
  if(1==n)  
  {  
  c[0][0]=a[0][0];  
  c[0][1]=a[0][1];  
  c[1][0]=a[1][0];  
  c[1][1]=a[1][1];  
  return;  
   
  };  
  if(2==n)  
  {  
  MatrixMultiply2By2(a,a,c);  
  return;  
  };  
  if(n%2)//n   is   odd  
  {  
  MatrixMultiply2By2_n_times_Power(a,n/2,temp);  
  MatrixMultiply2By2(temp,temp,c);  
  temp[0][0]=c[0][0];  
  temp[0][1]=c[0][1];  
  temp[1][0]=c[1][0];  
  temp[1][1]=c[1][1];  
  MatrixMultiply2By2(a,temp,c);  
  return;  
  }  
  else//n   is   even  
  {  
   
  MatrixMultiply2By2_n_times_Power(a,n/2,c);  
  temp[0][0]=c[0][0];  
  temp[0][1]=c[0][1];  
  temp[1][0]=c[1][0];  
  temp[1][1]=c[1][1];  
  MatrixMultiply2By2(temp,temp,c);  
  return;  
  }  
   
  }  
   
  int   main(int   argc,char   *argv[])  
  {  
  //char   t[2][3]={'a'};  
  int   a[2][2]={{1,1},{1,0}};  
  int   c[2][2]={{1,1},{1,0}};;  
   
  //MatrixMultiply2By2(a,a,c);  
  int   n,n1;  
  using   namespace   std;  
  while(true){  
   
   
  cin>>n;  
  if(n<0)  
  {  
  cout<<"   input   Negative   No.Error";  
  return   0;  
  };  
  if(0==n)  
  {  
  cout<<"Fibonacci("<<n<<")"<<a[1][1];  
  return   0;  
  };  
  MatrixMultiply2By2_n_times_Power(a,n,c);  
  cout<<"MatrixMultiplication   for   calculate   Fibonacci   No.   n,cost:   logN"<<endl;  
  cout<<"Fibonacci("<<n<<")="<<c[0][1];  
  //getch();  
  }  
   
  return   0;  
  }  

原创粉丝点击