您的位置:首页 > 职场人生

剑指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));
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: