關於斐波那契數列

在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

相關文章
相關標籤/搜索