剑指offer——面试题10:斐波那契数列
个人答案:
- #include"iostream"
- #include"stdio.h"
- #include"string.h"
- using namespace std;
- typedef long long ll;
- const int MAXN=;
- ll fib[MAXN];
- ll Fibonacci(int n)
- {
- if(fib[n]!=-)
- return fib[n];
- return fib[n]=Fibonacci(n-)+Fibonacci(n-);
- }
- int main()
- {
- int n;
- memset(fib,-,sizeof(fib));
- fib[]=;
- fib[]=;
- while(cin>>n)
- {
- cout<<Fibonacci(n)<<endl;
- }
- return ;
- }
官方答案:
- // 面试题10:斐波那契数列
- // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
- #include <cstdio>
- // ====================方法1:递归====================
- long long Fibonacci_Solution1(unsigned int n)
- {
- if(n <= )
- return ;
- if(n == )
- return ;
- return Fibonacci_Solution1(n - ) + Fibonacci_Solution1(n - );
- }
- // ====================方法2:循环====================
- long long Fibonacci_Solution2(unsigned n)
- {
- int result[] = {, };
- if(n < )
- return result[n];
- long long fibNMinusOne = ;
- long long fibNMinusTwo = ;
- long long fibN = ;
- for(unsigned int i = ; i <= n; ++ i)
- {
- fibN = fibNMinusOne + fibNMinusTwo;
- fibNMinusTwo = fibNMinusOne;
- fibNMinusOne = fibN;
- }
- return fibN;
- }
- // ====================方法3:基于矩阵乘法====================
- #include <cassert>
- struct Matrix2By2
- {
- Matrix2By2
- (
- long long m00 = ,
- long long m01 = ,
- long long m10 = ,
- long long m11 =
- )
- :m_00(m00), m_01(m01), m_10(m10), m_11(m11)
- {
- }
- long long m_00;
- long long m_01;
- long long m_10;
- long long m_11;
- };
- Matrix2By2 MatrixMultiply
- (
- const Matrix2By2& matrix1,
- const Matrix2By2& matrix2
- )
- {
- return Matrix2By2(
- matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,
- matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,
- matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,
- matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);
- }
- Matrix2By2 MatrixPower(unsigned int n)
- {
- assert(n > );
- Matrix2By2 matrix;
- if(n == )
- {
- matrix = Matrix2By2(, , , );
- }
- else if(n % == )
- {
- matrix = MatrixPower(n / );
- matrix = MatrixMultiply(matrix, matrix);
- }
- else if(n % == )
- {
- matrix = MatrixPower((n - ) / );
- matrix = MatrixMultiply(matrix, matrix);
- matrix = MatrixMultiply(matrix, Matrix2By2(, , , ));
- }
- return matrix;
- }
- long long Fibonacci_Solution3(unsigned int n)
- {
- int result[] = {, };
- if(n < )
- return result[n];
- Matrix2By2 PowerNMinus2 = MatrixPower(n - );
- return PowerNMinus2.m_00;
- }
- // ====================测试代码====================
- void Test(int n, int expected)
- {
- if(Fibonacci_Solution1(n) == expected)
- printf("Test for %d in solution1 passed.\n", n);
- else
- printf("Test for %d in solution1 failed.\n", n);
- if(Fibonacci_Solution2(n) == expected)
- printf("Test for %d in solution2 passed.\n", n);
- else
- printf("Test for %d in solution2 failed.\n", n);
- if(Fibonacci_Solution3(n) == expected)
- printf("Test for %d in solution3 passed.\n", n);
- else
- printf("Test for %d in solution3 failed.\n", n);
- }
- int main(int argc, char* argv[])
- {
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- Test(, );
- return ;
- }
剑指offer——面试题10:斐波那契数列的更多相关文章
- 剑指offer第二版-10.斐波那契数列
面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归 ...
- 剑指Offer - 九度1387 - 斐波那契数列
剑指Offer - 九度1387 - 斐波那契数列2013-11-24 03:08 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: ...
- 【剑指offer】9、斐波拉契数列
面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long ...
- 【剑指Offer】7、斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).假设n<=39. 解题思路: 斐波那契数列:0,1,1,2,3, ...
- 剑指offer【07】- 斐波那契数列(java)
题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...
- 剑指offer(7)斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...
- 【剑指offer】7:斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结 ...
- 【剑指offer】面试题 10. 斐波那契数列
面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...
- 剑指offer——矩阵覆盖(斐波那契变形)
****感觉都可以针对斐波那契写一个变形题目的集合了****** 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? cl ...
随机推荐
- 单元测试NUnit 的文章
请参考 https://www.cnblogs.com/ranh941/p/7629279.htmlhttps://blog.csdn.net/qincode/article/details/1831 ...
- 4.python 系统批量运维管理器之paramiko模块
paramiko paramiko是ssh服务最经常使用的模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. paramiko实现ssh2不外乎两个角度:SSH客户端与服务端 SS ...
- Oracle 写存储过程的一个模板还有一些基本的知识点
我很少用Oracle,也算新手,不过其实入手没有那么难,下面只是一个基本知识,高手绕道,其实数据库基本是相同的,这里提供都是基本知识点 有一个Oracle溢出的问题,容易让新手怀疑到无所怀疑,其实就是 ...
- ASP.Net UpdatePanel控件 局部刷新 && 弹出提示信息
参考博客: https://blog.csdn.net/qq_35019337/article/details/69972552 https://blog.csdn.net/huangyezi/art ...
- ASP.NET Core依赖注入最佳实践,提示&技巧
分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...
- XXX培训机构Python自动化教程目录
- PLSQL Developer连接远程Oracle
注:内容来网络 (一)不安装客户端的解决办法. 第一种方法: 1.在安装ORACLE服务器的机器上搜索下列文件, oci.dll ocijdbc10.dll ociw32.dll orannzsbb1 ...
- Bitnami WordPress如何修改MySQL root的默认密码?
Bitnami WordPress安装完毕后,MySQL root的默认密码为空,我们应该马上修改MySQL密码,在开始菜单里面,进入Bitnami ,启动控制台程序,随后输入: mysql -u r ...
- mysql 行转列,对列的分组求和,对行求和
CREATE TABLE students( id INT PRIMARY KEY, NAME VARCHAR(11)); CREATE TABLE courses( id INT PRIMARY K ...
- 如何设置linux支持上传的文件中文不乱吗
一.背景: 1.由于客户的需求,需要a链接打开的pdf文件,支持中文名称的 二.步骤 ①.查看当前编码 locale ②.编辑 vi /etc/profile 打开后结尾处添加 export LA ...