剑指offer--面试题10:斐波那契数列
2017-07-07 15:34
621 查看
#include<stdio.h> long long Fibonacci(unsigned n) {//简单的迭代方法,从下往上计算,首先根据f(0)和f(1)计算出f(2),再根据f(1)和f(2)计算出f(3)……以此类推。很容易理解,时间复杂度是O(n) int result[2]={0,1}; if(n<2) return result ; long long fx=0,fy=1,fn=0; for(unsigned int i=2;i<=n;++i) { fn=fx+fy; fx=fy; fy=fn; } return fn; } void main() { int n; while(1) { printf("输入n:"); scanf("%d",&n); printf("Fibonacci(%d)=%d\n",n,Fibonacci(n)); } }
#include<stdio.h> long long JumpFloor(unsigned int number) {//可以看做斐波那契问题。如果只有1级台阶,只有一种情况。如果有2级台阶,则有两种方法:一次是分两次跳,每次跳1级;另一种是一次跳2级。 //对于一般情况,把n级台阶的跳法看成n的函数f(n)。n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面n-1级台阶的跳法数目,即f(n-1); //另外一种是选择第一次跳2级,此时跳法数据等于后面的n-2级台阶的跳法数目,即为f(n-2)。 //因此,n级台阶的不同跳法总数是f(n)=f(n-1)+f(n-2)。 if(number<=1) return 1; if(number==2) return 2; long long fx=1,fy=2,fn=0; for(unsigned int i=3;i<=number;++i) { fn=fx+fy; fx=fy; fy=fn; } return fn; } void main() { int n; while(1) { printf("台阶数n:"); scanf("%d",&n); printf("该青蛙跳上一个%d级台阶共有%d种跳法\n",n,JumpFloor(n)); } }
#include<stdio.h> #include<math.h> long long JumpFloorII(int number) { //假设现在n=10,方法数记为f(10)。如果第一下跳了1级,那么剩下的方法为f(9),如果第一下跳了2级,那么剩下的方法是f(8), //依次类推……,如果第一下跳了9级那么剩下的方法是f(1),如果第一下就直接跳上10级,那么就只有一种方法。 //因此,f(10)=f(9)+f(8)+f(7)+f(6)+f(5)+f(4)+f(3)+f(2)+f(1)+1;刚开始f(1)=1,f(2)=2。 //也可这样理解:除了最后一个必须跳,前n-1个台阶,每一个台阶都有跳与不跳两种状态,根据排列组合原理,f(n)=2^(n-1). // return (int)pow(2,(number-1)); return 1<<--number; //移位运算 } void main() { int n; while(1) { printf("台阶数n:"); scanf("%d",&n); printf("该青蛙跳上一个%d级台阶共有%d种跳法\n",n,JumpFloorII(n)); } }
//假设现在是有8个2*1的小矩形去覆盖一个2*8的大矩形。我们把覆盖方法数记为f(8)。用第一个1*2的小矩形去覆盖大矩形的最左边有两个选择,竖着放或者横着放。 当竖着放的时候,右边还剩下2*7的区域,这种情况下的覆盖方法是f(7)。 接下来考虑横着放的情况。当用1*2的小矩形横着放在左上角的时候,左下角必须横着放一个1*2的小矩形,而在右边还剩下2*6的区域,这种情况下的覆盖方法记为f(6)。 因此f(8)=f(7)+f(6)。可以看出,这仍然是斐波那契数列。f(1)=1, f(2)=2,f(n)=f(n-1)+f(n-2); #include<stdio.h> long long Fibonacci(int n) { if(n<=0) return 0; if(n==1) return 1; if(n==2) return 2; int f1=1,f2=2; long long fn=0; for(unsigned int i=3;i<=n;++i) { fn=f1+f2; f1=f2; f2=fn; } return fn; } void main() { int n; while(1) { printf("输入n:"); scanf("%d",&n); printf("用%d个2*1的小矩形无重复地覆盖一个2*%d的大矩形,共有%ld种覆盖方法\n\n",n,n,Fibonacci(n)); } }
相关文章推荐
- 【剑指offer】面试题10:斐波那契数列
- <剑指offer 面试题10_1>斐波那契数列 Java
- 剑指offer面试题[10]-二进制中1的个数
- 【剑指offer】面试题9:斐波那契数列
- 剑指offer 面试题9:斐波那契数列
- 剑指offer--面试题10:二进制中1的个数--Java实现
- 剑指Offer面试题10[二进制中1的个数]
- 剑指Offer面试题9斐波那契数列
- 剑指offer面试题9 斐波那契数列及青蛙跳台阶问题
- 剑指offer 面试题9 斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶
- 剑指Offer----面试题10:二进制中1的个数
- 剑指offer-面试题10:二进制中1的个数
- 剑指offer——面试题10:二进制中1的个数
- 剑指offer-面试题10-二进制中1的个数
- 剑指Offer面试题10:二进制中1的个数
- 【剑指offer】面试题九:斐波那契数列
- 剑指Offer---面试题9:斐波那契数列
- 【练习笔记】剑指offer-面试题10 :二进制中1的个数
- 剑指offer 面试题9 斐波那契数列 java版答案
- 【面试题】剑指Offer-10-统计二进制中1的个数