描述
有一种数列,它的前 10 项的值分别为: 1 2 5 12 29 70 169 408 985 2378 ,这个数列被称为 Pell 数列,请问该数列的第 n 项的值是多少?( n<=1000 )
输入描述
一个整数 n
输出描述
第 n 项的值
用例输入 1
10
用例输出 1
2378
来源
递推
这个题难度较大,我们要用到高精度和递推。首先找到递推式,发现为a[i]=a[i-1]*2+a[i-2],然后用高精度算出结果并输出。
以下是示例代码:
#include<bits/stdc++.h>
using namespace std;
string he(string s1,string s2){
int a[1001]={0},b[1001]={0},c[1001]={0};
string r;
int x1=s1.size(),x2=s2.size(),i,k;
for(i=0;i<x1;i++){
a[i]=s1[x1-i-1]-'0';
}
for(i=0;i<x2;i++){
b[i]=s2[x2-i-1]-'0';
}
k=x1;
if(x2>x1) k=x2;
for(i=0;i<k;i++){
c[i]=a[i]+b[i];
}
for(i=0;i<k;i++){
if(c[i]>=10){
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
}
if(c[k]!=0) k++;
char f;
for(i=k-1;i>=0;i--){
f=c[i]+'0';
r=r+f;
}
return r;
}
string cheng(string s){
string r;
int a[1100]={0},i,x=s.size(),k;
for(i=0;i<x;i++){
a[i]=s[x-i-1]-'0';
}
k=x;
for(i=0;i<x;i++){
a[i]=a[i]*2;
}
for(i=0;i<x;i++){
if(a[i]>=10){
a[i+1]=a[i+1]+a[i]/10;
a[i]=a[i]%10;
}
}
if(a[k]!=0) k++;
char f;
for(i=k-1;i>=0;i--){
f=a[i]+'0';
r=r+f;
}
return r;
}
int main()
{
string x,y,z;
int n;
cin>>n;
x="1";
y="2";
for(int i=3;i<=n;i++){
z=he(cheng(y),x);
x=y;
y=z;
}
if(n==1){
cout<<x;
}else if(n==2){
cout<<y;
}else{
cout<<z;
}
return 0;
}