calculate Fibonacci Num by using Dynamic plan method

本文介绍了一种使用矩阵乘法快速计算斐波那契数的方法,该方法的时间复杂度为O(logN),相较于传统的递归或迭代方法更为高效。通过递归地将矩阵乘法应用于特定的2x2矩阵,可以有效地计算出任意位置的斐波那契数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*  
    *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;  
  }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值