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;}
阅读全文
0 0
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci 数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Fibonacci数
- Shell输入输出重定向
- TOP命令
- javascript中的“this”总结
- 穷不可怕,可怕的是“穷人思维”
- Date--时间类
- Fibonacci数
- 原生js封装ajax函数
- Java中Runnable和Thread的区别
- 在集合中使用泛型
- 软考笔记-网络图
- 494. Target Sum
- DateFormat
- 浅析新手如何做好SEO峰任与你同行
- flow3