Fibonacci 数列
2016-03-24 16:13
369 查看
方法一、使用递归的方法 求斐波那契第n项!
这种方法虽然代码看起来简单,但是,效率非常低。因为在递归求解的过程中重复计算。
方法二、使用循环的方法,循环的方法可以避免重复计算。
方法三、使用矩阵快速幂 求斐波那契第n项!
这种方法虽然代码看起来简单,但是,效率非常低。因为在递归求解的过程中重复计算。
long long Fibonacci(unsigned int n) { if(n <= 0) return 0; if(n == 1) return 1; return Fibonacci(n-1) + Fibonacci(n-2); }
方法二、使用循环的方法,循环的方法可以避免重复计算。
long long Fibonacci(unsigned int n) { int result[2] = {0,1}; if(n < 2) return result ; long long fibNMinusOne = 1; long long finNMinusTwo = 0; long long fibN = 0; for(int i = 2; i <= n; ++i) { fibN = fibNMinusOne + finNMinusTwo; finNMinusTwo = fibNMinusOne; fibNMinusOne = fibN; } return fibN; }
方法三、使用矩阵快速幂 求斐波那契第n项!
#include <iostream> #include <cstring> using namespace std; struct mat { long long m[2][2]; mat() { memset(m, 0, sizeof(m)); } }; int n=2; mat operator * (mat a, mat b) { mat c; for(int i=0; i<n; i++) for(int j=0; j<n; j++) for(int k=0; k<n; k++) c.m[i][j] += (a.m[i][k] * b.m[k][j]) % 1000000007; //记得模 return c; } void print(mat a) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) cout << a.m[i][j] << " "; cout << endl; } } int main() { int t; while(cin >> t) { if(t == -1) break; mat a; mat c; c.m[0][0] = 1; c.m[0][1] = 0; c.m[1][0] = 0; c.m[1][1] = 1; a.m[0][0] = 1; a.m[0][1] = 1; a.m[1][0] = 1; a.m[1][1] = 0; int N = t; while(N) { if(N%2) c = c * a; a = a * a; N /= 2; } cout << c.m[0][1]%1000000007 << endl; } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性