杭電HDU2018 奶牛的故事

D.Fu發表於2018-08-02

有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?

Input

輸入資料由多個測試例項組成,每個測試例項佔一行,包括一個整數n(0<n<55),n的含義如題目中描述。 
n=0表示輸入資料的結束,不做處理。

Output

對於每個測試例項,輸出在第n年的時候母牛的數量。 
每個輸出佔一行。

Sample Input

2
4
5
0

Sample Output

2
4
6

題目分析:這道題相信很多人都會感到眼熟,是不是感覺跟斐波那契數列相似,有了這個方向就可以很自然的想到這道題應該是使用遞推來完成

現在分析規律,對於遞推提,先把前幾項列出來不失為一種好方法

f1=1 f2=2;f3=3,f4=4,f5=6,f7=9.......

想必大家也已經看出這道題的規律,就是在fx,x<4時,fx=x,x>=4時,fx=f(x-1)+f(x-3);

那麼思路就很明顯了,只不過是採用函式儲存然後查詢還是直接現用現遞推,這裡給出函式儲存的程式碼

#include<iostream>
#include<cstdio>
#include<map>

using namespace std;

long long  f[60]={0,1,2,3};
map<int,long long >cow;

int main()
{
    cow[1]=1;
    cow[2]=2;
    cow[3]=3;
    for(int i=4;i<60;i++)
    {
        f[i]=f[i-3]+f[i-1];
        cow[i]=f[i];
    }
    int n;
    while(scanf("%d",&n)&&n)
    {
        cout<<cow[n]<<endl;
    }
    return  0;
}

遞推的程式碼

#include<iostream>
#include<cstdio>

using namespace std;

long long  f(long long  n)
{
    if(n==1) return 1;
    if(n==2) return  2;
    if(n==3) return  3;
    if(n>3)
    {
        return  f(n-1)+f(n-3);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    int n;
    while(scanf("%d",&n)&&n)
    {
        long long  ans=0;
        ans=f(n);
        cout<<ans<<endl;
    }
    return  0;
}

 

相關文章