Pell数列的代码问题

先放题目:
总时间限制: 3000ms 内存限制: 65536kB
描述
Pell数列a1, a2, a3, …的定义是这样的,a1 = 1, a2 = 2, … , an = 2 * an − 1 + an - 2 (n > 2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1 ≤ k < 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个非负整数。
样例输入
2
1
8
样例输出
1
408

我最开始能直接想到的做法是写一个递归函数,然后在main函数里对n个数据依次调用:

#include
#include
using namespace std;
int Pell(int n){
    if(n==1|n==2) return n;
    if(n>2) return (2*Pell(n-1)+Pell(n-2))%32767;
	}
int main(){
	int num,a;
	cin>>num;
	while(num--){
		cin>>a;
		Pell(a);
	}
	return 0;	
} 

测试的数据和得到的结果:
Pell数列的代码问题_第1张图片
可以看到因为我是用了一个while 循环,输入一个数据就对应输出一个值,然而这并不符合题目要求。
于是我把while循环去掉,用一个数组存储输入的n个数据(for循环),在用一个for循环依次调用Pell函数:

#include
#include
using namespace std;
int Pell(int n){
    if(n==1|n==2) return n;
    if(n>2) return (2*Pell(n-1)+Pell(n-2))%32767;
	}
int main(){
	int n;
	cin>>n;
	int a[n];
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++) 
		cout<

正好把我犯的错误也记录一下,“cout< 终于,在我用的dev c++上通过了,结果提交到OJ上,没有得到美丽的Accept, 而是给了我一个Time Limit Exceeded,555,于是我又查了这个错误的原因:
1.没有循环终止条件;
2.函数调用超时;
3.程序算法不够优化。
4.程序本身存在问题。
再看题目限制的时间是300s,Emmmm,一定是我的递归函数太慢了,所以,
是的我打算先睡一觉,明天再继续打这篇曲折的代码~

清早起床,心情好好~~
其实现在已经中午了,于是我将递归函数去掉,在main函数写了一个含有1000010个元素的数组来存储Pell 数列,得到的结果是Runtime Error, emmmm,好吧,我想到如果我们只要求第8个pell数列,8以后的都没必要算出来,再改:

#include
#include
using namespace std;
int Pell(int k){
	if(k==1|k==2) return k;
	else{
		int a1=1,a2=2,a3=0;
		for(int i=3;i<=k;i++){
			a3=(2*a2+a1)%32767;
			a1=a2;
			a2=a3;
		}	
		return a3;
	}
}
int main(){
	int n;
	cin>>n;
	int a[n];
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++) 
		cout<

终于,可喜可泣:
![成功了]~(https://img-blog.csdn.net/20181019134133340?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDg2OTUy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

以此告诫自己,编程一定要耐心,想要学好学扎实就得再反复编译调试修改中发现自己的问题,因为本来就比较笨,以后才更不要怕麻烦,多写多看。
之后就不再这么啰嗦的记录解题过程了~~
最后附上一张扎心的图:
Pell数列的代码问题_第2张图片

你可能感兴趣的:(算法)