斐波那契数列(取模)

题目:

菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。

给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。

输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
 
1.递归
#include<iostream>
#include<cstdio>
using namespace std;

long long dfs(int i)
{
    if(i==1) return 1;
    if(i==2) return 1;
    return dfs(i-2)+dfs(i-1);
}


int main()
{
    int n,s,a;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        s=dfs(a);
        cout<<s%1000<<endl;
    }
    return 0;
}

2.记忆化搜索

#include<iostream>
#include<cstdio>
using namespace std;
long long f[60];
long long dfs(int i)
{
    if(i==1) return f[1]=1;
    if(i==2)  return f[2]=1;
    if(f[i]>0)  return f[i];
    return  f[i]=(dfs(i-1)+dfs(i-2))%1000;
}


int main()
{
    long long n,a;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        cout<<dfs(a)<<endl;
    }
    return 0;
}

3.递推

#include<iostream>
#include<cstdio>
//#define maxsize 1000005
int a[1000010];
using namespace std;
int main()
{
    int n,s;
    a[1]=a[2]=1;
    for(int i=3;i<=1000010;i++)
    {
        a[i]=a[i-1]+a[i-2];
        a[i]%=1000;
    }
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>s;
        cout<<a[s]<<endl;
    }
    return 0;
}

 

posted @ 2022-09-25 19:31  为么要取名字  阅读(455)  评论(0编辑  收藏  举报