Fibonacci数

来源:互联网 发布:秦始皇兵马俑知乎 编辑:程序博客网 时间:2024/06/08 03:01

Fibonacci数
时间限制:3000 ms | 内存限制:65535 KB
难度:1
描述
无穷数列1,1,2,3,5,8,13,21,34,55…称为Fibonacci数列,它可以递归地定义为
F(n)=1 ………..(n=1或n=2)
F(n)=F(n-1)+F(n-2)…..(n>2)
现要你来求第n个斐波纳奇数。(第1个、第二个都为1)
输入
第一行是一个整数m(m<5)表示共有m组测试数据
每次测试数据只有一行,且只有一个整形数n(n<20)
输出
对每组输入n,输出第n个Fibonacci数
样例输入
3
1
3
5
样例输出
1
2
5
问题分析:
对于这个题目可以递归的一项一项求斐波那契第n项,n<20;所以可以利用递推式求出前20个斐波那契数,然后要那个就输出那个。
这里采用斐波那契性质:
这里写图片描述
利用二分求幂的方法直接求第n个斐波那契数。
需要注意的是矩阵的乘法。

代码:

#include <iostream>#include <stdio.h> #include <string.h>#include <math.h>#include <vector>#include <queue>#include <stack>#include <map>#include <string>#include <algorithm>#define N 2using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */struct rect{    int a[N][N];    rect operator*(const rect &r)const{        //矩阵乘法        rect ans;        ans.inint(0);         for(int i=0;i<N;i++){            for(int j=0;j<N;j++){                for(int k=0;k<N;k++){                    ans.a[i][j]=ans.a[i][j]+a[i][k]*r.a[k][j];                 }             }         }         return ans;    }    void inint(){        //初始化矩阵为单位矩阵        a[0][0]=1;        a[0][1]=0;          a[1][0]=0;        a[1][1]=1;       }    void inint(int x){        //初始化矩阵为单位矩阵        a[0][0]=x;        a[0][1]=x;          a[1][0]=x;        a[1][1]=x;       }};int main(int argc, char** argv) {    //斐波那契初始矩阵     rect original;    original.a[0][0]=1;    original.a[0][1]=1;     original.a[1][0]=1;    original.a[1][1]=0;//  rect ans;//  ans.inint();//  //  ans=ans*original;//  //  cout<<ans.a[0][1];    int m,n;    cin>>m;    while(m--){        cin>>n;        rect ans;        ans.inint();        rect c=original;          //二分求幂求矩阵的n次方         while(n!=0){            if(n%2 == 1){                ans=ans*c;            }            c=c*c;            n/=2;        }        //输出结果        cout<<ans.a[0][1]<<endl;     }    return 0;}