剑指offer--面试题10:斐波那契数列

来源:互联网 发布:office2016英文版 mac 编辑:程序博客网 时间:2024/06/06 20:58

#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[n];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));}}


原创粉丝点击