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
",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
",y);
		int a;
		scanf("%d",&a);
		printf("%d
",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("
");
	}
	return 0;
	
}
要做就做南波万
原文地址:https://www.cnblogs.com/liuziwen0224/p/11991538.html