个人答案:

  1. #include"iostream"
  2. #include"stdio.h"
  3. #include"string.h"
  4. using namespace std;
  5. typedef long long ll;
  6. const int MAXN=;
  7.  
  8. ll fib[MAXN];
  9. ll Fibonacci(int n)
  10. {
  11. if(fib[n]!=-)
  12. return fib[n];
  13. return fib[n]=Fibonacci(n-)+Fibonacci(n-);
  14. }
  15.  
  16. int main()
  17. {
  18. int n;
  19. memset(fib,-,sizeof(fib));
  20. fib[]=;
  21. fib[]=;
  22. while(cin>>n)
  23. {
  24. cout<<Fibonacci(n)<<endl;
  25. }
  26. return ;
  27. }

官方答案:

  1. // 面试题10:斐波那契数列
  2. // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
  3.  
  4. #include <cstdio>
  5.  
  6. // ====================方法1:递归====================
  7. long long Fibonacci_Solution1(unsigned int n)
  8. {
  9. if(n <= )
  10. return ;
  11.  
  12. if(n == )
  13. return ;
  14.  
  15. return Fibonacci_Solution1(n - ) + Fibonacci_Solution1(n - );
  16. }
  17.  
  18. // ====================方法2:循环====================
  19. long long Fibonacci_Solution2(unsigned n)
  20. {
  21. int result[] = {, };
  22. if(n < )
  23. return result[n];
  24.  
  25. long long fibNMinusOne = ;
  26. long long fibNMinusTwo = ;
  27. long long fibN = ;
  28. for(unsigned int i = ; i <= n; ++ i)
  29. {
  30. fibN = fibNMinusOne + fibNMinusTwo;
  31.  
  32. fibNMinusTwo = fibNMinusOne;
  33. fibNMinusOne = fibN;
  34. }
  35.  
  36. return fibN;
  37. }
  38.  
  39. // ====================方法3:基于矩阵乘法====================
  40. #include <cassert>
  41.  
  42. struct Matrix2By2
  43. {
  44. Matrix2By2
  45. (
  46. long long m00 = ,
  47. long long m01 = ,
  48. long long m10 = ,
  49. long long m11 =
  50. )
  51. :m_00(m00), m_01(m01), m_10(m10), m_11(m11)
  52. {
  53. }
  54.  
  55. long long m_00;
  56. long long m_01;
  57. long long m_10;
  58. long long m_11;
  59. };
  60.  
  61. Matrix2By2 MatrixMultiply
  62. (
  63. const Matrix2By2& matrix1,
  64. const Matrix2By2& matrix2
  65. )
  66. {
  67. return Matrix2By2(
  68. matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,
  69. matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,
  70. matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,
  71. matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);
  72. }
  73.  
  74. Matrix2By2 MatrixPower(unsigned int n)
  75. {
  76. assert(n > );
  77.  
  78. Matrix2By2 matrix;
  79. if(n == )
  80. {
  81. matrix = Matrix2By2(, , , );
  82. }
  83. else if(n % == )
  84. {
  85. matrix = MatrixPower(n / );
  86. matrix = MatrixMultiply(matrix, matrix);
  87. }
  88. else if(n % == )
  89. {
  90. matrix = MatrixPower((n - ) / );
  91. matrix = MatrixMultiply(matrix, matrix);
  92. matrix = MatrixMultiply(matrix, Matrix2By2(, , , ));
  93. }
  94.  
  95. return matrix;
  96. }
  97.  
  98. long long Fibonacci_Solution3(unsigned int n)
  99. {
  100. int result[] = {, };
  101. if(n < )
  102. return result[n];
  103.  
  104. Matrix2By2 PowerNMinus2 = MatrixPower(n - );
  105. return PowerNMinus2.m_00;
  106. }
  107.  
  108. // ====================测试代码====================
  109. void Test(int n, int expected)
  110. {
  111. if(Fibonacci_Solution1(n) == expected)
  112. printf("Test for %d in solution1 passed.\n", n);
  113. else
  114. printf("Test for %d in solution1 failed.\n", n);
  115.  
  116. if(Fibonacci_Solution2(n) == expected)
  117. printf("Test for %d in solution2 passed.\n", n);
  118. else
  119. printf("Test for %d in solution2 failed.\n", n);
  120.  
  121. if(Fibonacci_Solution3(n) == expected)
  122. printf("Test for %d in solution3 passed.\n", n);
  123. else
  124. printf("Test for %d in solution3 failed.\n", n);
  125. }
  126.  
  127. int main(int argc, char* argv[])
  128. {
  129. Test(, );
  130. Test(, );
  131. Test(, );
  132. Test(, );
  133. Test(, );
  134. Test(, );
  135. Test(, );
  136. Test(, );
  137. Test(, );
  138. Test(, );
  139. Test(, );
  140.  
  141. Test(, );
  142.  
  143. return ;
  144. }

剑指offer——面试题10:斐波那契数列的更多相关文章

  1. 剑指offer第二版-10.斐波那契数列

    面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归 ...

  2. 剑指Offer - 九度1387 - 斐波那契数列

    剑指Offer - 九度1387 - 斐波那契数列2013-11-24 03:08 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: ...

  3. 【剑指offer】9、斐波拉契数列

    面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long ...

  4. 【剑指Offer】7、斐波那契数列

      题目描述:   大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).假设n<=39.   解题思路:   斐波那契数列:0,1,1,2,3, ...

  5. 剑指offer【07】- 斐波那契数列(java)

    题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...

  6. 剑指offer(7)斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...

  7. 【剑指offer】7:斐波那契数列

    题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结 ...

  8. 【剑指offer】面试题 10. 斐波那契数列

    面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...

  9. 剑指offer——矩阵覆盖(斐波那契变形)

    ****感觉都可以针对斐波那契写一个变形题目的集合了****** 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? cl ...

随机推荐

  1. 单元测试NUnit 的文章

    请参考 https://www.cnblogs.com/ranh941/p/7629279.htmlhttps://blog.csdn.net/qincode/article/details/1831 ...

  2. 4.python 系统批量运维管理器之paramiko模块

    paramiko paramiko是ssh服务最经常使用的模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. paramiko实现ssh2不外乎两个角度:SSH客户端与服务端 SS ...

  3. Oracle 写存储过程的一个模板还有一些基本的知识点

    我很少用Oracle,也算新手,不过其实入手没有那么难,下面只是一个基本知识,高手绕道,其实数据库基本是相同的,这里提供都是基本知识点 有一个Oracle溢出的问题,容易让新手怀疑到无所怀疑,其实就是 ...

  4. ASP.Net UpdatePanel控件 局部刷新 && 弹出提示信息

    参考博客: https://blog.csdn.net/qq_35019337/article/details/69972552 https://blog.csdn.net/huangyezi/art ...

  5. ASP.NET Core依赖注入最佳实践,提示&技巧

    分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...

  6. XXX培训机构Python自动化教程目录

  7. PLSQL Developer连接远程Oracle

    注:内容来网络 (一)不安装客户端的解决办法. 第一种方法: 1.在安装ORACLE服务器的机器上搜索下列文件, oci.dll ocijdbc10.dll ociw32.dll orannzsbb1 ...

  8. Bitnami WordPress如何修改MySQL root的默认密码?

    Bitnami WordPress安装完毕后,MySQL root的默认密码为空,我们应该马上修改MySQL密码,在开始菜单里面,进入Bitnami ,启动控制台程序,随后输入: mysql -u r ...

  9. mysql 行转列,对列的分组求和,对行求和

    CREATE TABLE students( id INT PRIMARY KEY, NAME VARCHAR(11)); CREATE TABLE courses( id INT PRIMARY K ...

  10. 如何设置linux支持上传的文件中文不乱吗

    一.背景: 1.由于客户的需求,需要a链接打开的pdf文件,支持中文名称的 二.步骤 ①.查看当前编码 locale ②.编辑 vi  /etc/profile 打开后结尾处添加  export LA ...