剑指Offer - 九度1387 - 斐波那契数列
2013-11-24 03:08
题目描述:

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下:

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入包括一个整数n(1<=n<=70)。

输出:

对应每个测试案例,

输出第n项斐波那契数列的值。

样例输入:
3
样例输出:
2
题意分析:
  斐波那契数列的定义:
    f[1] = 1, f[2] = 1
    f[n] = f[n - 1] + f[n - 2], n >= 3
  数学推导上,可以用特征根方程求出x^2 = x + 1的俩根 x = (1 土 sqrt(5)) / 2,编程的话你当然不会这么无聊去惹出一对无理数来。
  方法一,从f[1]、f[2]开始逐个计算f[3]到f[n],求出f[n]。时间复杂度O(n),空间复杂度O(1)。
  方法二,用矩阵来计算。
    将[f[n + 1], f[n]]作为一个列向量v[n],从v[n - 1] = [f[n - 1], f[n - 2]]到v[n]要经过一次线性变换T(v),T对应的矩阵A就是我们要构造的(当然是对应于自然基的)。
    设A = [a, b; c, d], v[n] = A * v[n - 1],显然(a, b, c, d)的解不唯一,就构造个最简单的就行了:[a, b, c, d] = [1, 1, 1, 0]。
    v[n] = A^(n - 1) * v[1],于是问题就转化成了矩阵的快速幂。时间复杂度O(log(n)),递归求解空间复杂度O(log(n))。
  数据范围小的话,用方法一就行,一般int和long long数据范围也只能支持几十个Fibonacci数。要计算大数的话,高精度算法配合方法二的O(log(n))效率肯定是免不了的。
下面是O(n)简单算法,数据量才70就不大材小用了,Over engineered是个坏习惯。
 // 651776    zhuli19901106    1387    Accepted    点击此处查看所有case的执行结果    1020KB    456B    0MS
//
#include <cstdio>
using namespace std; int main()
{
int n, i;
long long int f1, f2, f3; while(scanf("%d", &n) == ){
if(n == ){
printf("0\n");
continue;
}
if(n == ){
printf("1\n");
continue;
}
f1 = ;
f2 = ;
for(i = ; i < n; ++i){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
} printf("%lld\n", f3);
} return ;
}

剑指Offer - 九度1387 - 斐波那契数列的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 剑指offer笔记面试题10----斐波那契数列

    题目:求斐波那契数列的第n项.写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下:f(0) = 0, f(1) = 1,f(n) = f(n - 1) + f(n - 2). 测试用例 ...

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

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

  9. 剑指Offer - 九度1388 - 跳台阶

    剑指Offer - 九度1388 - 跳台阶2013-11-24 03:43 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包 ...

随机推荐

  1. MAC读取希捷移动硬盘ntfs

    希捷提供了mac读取ntfs磁盘的软件,Paragon. 搜索关键词 "希捷" "mac" 或者通过以下链接进入 https://www.seagate.com ...

  2. 解决频繁自动弹出“QQ拼音升级程序”,可使用旧版QQ输入法

    QQ输入法(2017年9月6日版本)下载地址: http://dlc2.pconline.com.cn/filedown_90891_8506339/BZXMP3fp/QQPinyin_Setup_5 ...

  3. 阿里云主机ss

    https://promotion.aliyun.com/ntms/act/vm/aliyun-group/buy.html?group=HdcwGIaf6i

  4. python_5_password

    #1.python2中raw_input与python3中的input是相同的,python2中也有input但是别用(不好用,忘记它) #密码是明文的 username=input("us ...

  5. Python类型转换+序列操作+基本概念辨析速查手册

     第一部分是Python语言中基础中的基础,根据网上资料,合并如下:       1.类型转换     int(x [,base])  将x转换为一个整数     long(x [,base]) 将x ...

  6. 用js给元素加css

    1.如果是没有CSS文件,或者要修改的不在CSS文件里,那么: document.getElementById('DIV标签的ID').style.属性='属性值'; 这样就可以了.2.如果,样式是写 ...

  7. js另类值交换

    当我们有a.b两个值,想要交换,通常是要声明第三个变量,但是我最近看到这样一种不用声明第三个变量的处理方法: var a=1,b=2; a=[b,b=a][0]; 其实还是在内存中开出了一个新的空间( ...

  8. 2.Spring Cloud初相识--------Eureka服务注册与消费

    前言: 1.Eureka介绍: Spring Cloud Eureka,使用Netflix Eureka来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用Java ...

  9. iOS 检测版本更新(02)

    iOS 检测版本更新 如果我们要检测app版本的更新,那么我们必须获取当前运行app版本的版本信息和appstore 上发布的最新版本的信息. 当前运行版本信息可以通过info.plist文件中的bu ...

  10. view的superview的变换

    今天遇到一个奇怪的问题,一个view(称为subview)被加在了一个cell(superView1)上,然后创建了一个view(为superView2),将subview重新加在了superView ...