题目描述
有一种数列,它的前十项分别为:1 2 5 12 29 70 169 408 985 2378,这个数列被称为Pell数列,请问该数列的第n项的值是多少?(n <= 1000)
输入
一个整数n
输出
第n项的值
样例输入
10
样例输出
2378
这道题是一个非常经典的题目,主要考察两点:递推与高精度
先找规律罢!
显而易见,这道题的规律就是 a[n] = a[n-1] * 2 + a[n - 2]
但是,我们可以在题目上看到,这个数列的值增长的很快,所以必须要用高精度
高精度会吧,找规律会吧,递推会吧,输入输出会吧,把它们加在一起,会吧,这样,你就完成了你的 *史诗巨作* 代码。
看看代码
#include <bits/stdc++.h> //万能头文件
using namespace std;
int al[1005] , bl[1005] , cl[1005];
void rubbish(){ //初始化三个数组的垃圾桶
for(int i = 0 ; i < 520 ; i ++){
cl[i] = {0};
bl[i] = {0};
al[i] = {0};
}
}
string pl(string a ,string b){ //高精度加法
//al[520] = { }; bl[520] = { }; cl[520] = { };
int len = max(a.length() , b.length());
for(int i = a.length() - 1 , j = 1 ; i >= 0 ; i --, j ++){
al[j] = a[i] - '0';
}
for(int i = b.length() - 1 , j = 1 ; i >= 0 ; i --, j ++){
bl[j] = b[i] - '0';
}
for(int i = 1 ; i <= len ; i ++){
cl[i] += al[i] + bl[i];
cl[i + 1] = cl[i] / 10;
cl[i] %= 10;
}
if(cl[len + 1]){
len ++;
}
string ans;
string str;
for(int i = len ; i >= 1 ; i --){
//str = to_string(cl[i]);
//ans.append(str);
ans += cl[i] + '0';
//cout << cl[i];
}
rubbish();//浅浅的扔一下垃圾
return ans;
}
int pell(int n){ //Pell数列的函数
if(n == 1){
cout << 1 <<endl;
}
if(n == 2){
cout << 2 <<endl;
}
string a = "1" , b = "2" , c = "0" , h = "0";
for(int i = 0 ; i < n - 2 ; i ++){
h = pl(b , b); //b*2 可以转换成 2 个 b 相加
c = pl(h , a);
a = b;
b = c;
}
cout << b <<endl;
}
int main()
{
int p;
cin >> p; //输入
pell(p);
//cout << pl("12","12") <<" "<< pl("24","5")<<endl;
//cout << pl("1","2") <<" "<<pl("5","9")<<endl;
return 0;
}
/*
in
10
out
2378
*/
当然,这个代码肯定还能优化辣!
本文介绍Pell数列,这是一个数列,前几项为1, 2, 5, 12...。题目要求求解数列的第n项,n不超过1000。解题关键在于发现递推关系a[n] = a[n-1] * 2 + a[n - 2],并使用高精度处理大数值。文章提供了思路和代码实现。"
107361798,8765276,Python生成器:从基础到实践,"['Python', '编程语言', '数据处理', '内存效率', '生成器']

2898





