Openjudge 2.2-2.3 递归与递推

2.2.1755&2.3.1760

斐波那契数列的递归与递推

2.3.1760

描述

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

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

输入

\(1\)行是测试数据的组数\(n\),后面跟着\(n\)行输入。每组测试数据占\(1\)行,包括一个正整数\(a\)(\(1 \leq a \leq 10^6\))。

输出

\(n\)行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第\(a\)个数对\(1000\)取模得到的结果。

样例输入

4
5
2
19
1

样例输出

5
1
181
1

分析:数据规模大,而且有取模运算,可以使用数组
\(TLE\)了因为递归规模太大改用递推)

\(AC\)代码

#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#define K 1000
using namespace std;
int f[1000005],y=0;
int main(){
    scanf("%d",&y);
//  printf("yy%d\n",y);
    f[1]=1;f[2]=1;
    for(int i=3;i<=1000005;i++){
        f[i]=(f[i-1]%K+f[i-2]%K)%K;
    }
    while(y--){
    //  printf("i %d 3\n",y);
        int a;
        scanf("%d",&a);
        printf("%d\n",f[a]);
    }
    return 0;
}

为啥本地编译的时候初始值\(y=4\)之后突然变成\(y=130\)呢...奇怪

2.2.1755

描述

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

给出一个正整数\(a\),要求菲波那契数列中第\(a\)个数是多少。

输入

第1行是测试数据的组数\(n\),后面跟着\(n\)行输入。每组测试数据占1行,包括一个正整数\(a\)(\(1 \leq a \leq 20\))

输出

输出有\(n\)行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第\(a\)个数的大小

样例输入与输出

同上


分析:数据规模小,可以递推

AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
#define K 1000
int m(int p){
    if(p==1) return 1;
    if(p==2) return 1;
    else return m(p-1)+m(p-2);
}
int main(){
    memset(a,0,sizeof(a));
    scanf("%d",&n);
    while(n--){
        int a;
        scanf("%d",&a);
        printf("%d",m(a));
        printf("\n");
    }
    return 0;
    
}

猜你喜欢

转载自www.cnblogs.com/liuziwen0224/p/11991538.html