关于斐波那契数列

在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,以下图: ios

clipboard.png

Input
输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50)。
Output
对于每一个测试实例,请输出铺放方案的总数,每一个实例的输出占一行。数组

以上是最近ACM做业题中作到的一道题。找规律,发现其实就斐波那契数列(以兔子繁殖引出,又叫兔子数列):函数

f(0)=1;
f(1)=1;
f(n)=f(n-1)+f(n-2);(n>=2;n为正整数)

显然,就是个递归的作法。
因而我一开始的代码以下:测试

#include<iostream>
using namespace std;
int function(int n)//递归函数
{
   if(n==1||n==2||n==3)
        return n;
   else 
        return function(n-1)+function(n-2); 
}
int main()
{  
    int n;
    while(scanf("%d",&n)!=EOF)//函数以EOF结束
    {
        cout<<function(n)<<endl;
    }
}

结果却显示 Time Limit Exceeded,我看到这边有n<50;便想到了以前用数组存装,减小运行时间的方法。spa

#include<iostream>
#include<cstdlib>//我试了一下,去掉此头文件,提交的时候也显示经过。
using namespace std;
__int64 w[51]={0};//定义全局数组,存放数据。
__int64 function(int n)
{
    if(n==1)
        return w[1]=n;
    else if(n==2)
        return w[2]=n;
    else if(n==3)
        return w[3]=n;
    else if(w[n]!=0)
        return w[n];//当数据已存在数组中,直接返回数组中的数据,可节约时间。
    else 
        return w[n]=function(n-1)+function(n-2);
}
int main()
{
    
    int i=3,n;
    while(scanf("%d",&n)!=EOF)
    {
   
    cout<<function(n)<<endl;
    }
return 0;
 }

这样提交便显示经过了。
这边再提一下,只用int型的话会出现wrong answer。好像是由于斐波那契数列数据过大,int型存储空间不够。
__int64是64位长整型(这种概念我也还没弄懂,反正就是存储空间比int还要大一点就是了。code

__int64 a;
输入输出的时候用 %I64d
scanf(”%I64d”,&a);
printf(”%I64d”,a);

后来我在网上搜索,代码以下。递归

#include<iostream>
using namespace std;
int main()
{
 int n,i;
    __int64 a[51]={1,1,2};
    for(i=3;i<=50;i++)
 {a[i]=a[i-1]+a[i-2];}
 while(scanf("%d",&n)!=EOF)
 {printf("%I64d\n",a[n]);}
 return 0;
}

一开始就把每一个数组都赋值了,我提交,也能经过。ip

相关文章
相关标签/搜索