题目描述
有一种数列,它的前10项的值分别为:1 2 5 12 29 70 169 408 985 2378,这个数列被称为Pell数列,请问该数列的第n项的值是多少?(n<=1000)
输入
一个整数n。
输出
第n项的值。
样例
输入
复制
10
输出
复制
2378
这题目一看就是递推,特简单的那种。但是再看数据范围,就能知道没那么简单。
肯定超long long了,所以高精度必不可少。
有两种,一种高精度加法,一种高精度乘低精度。
分别都写一个函数就清清楚楚了
高精度加法
string ja(string a1,string b1){
int n=a1.size(),m=b1.size(),a[10005]={},b[10005]={},c[10005]={},k,i,x;
string s;
for(i=0;i<n;i++) a[n-i]=a1[i]-'0';
for(i=0;i<m;i++) b[m-i]=b1[i]-'0';
k=1;
x=0;
while(k<=n||k<=m){
c[k]=a[k]+b[k]+x;
x=c[k]/10;
c[k]%=10;
k++;
}
c[k]=x;
if(c[k]==0)k--;
for(i=k;i>=1;i--)s+=c[i]+'0';
return s;
}
高精度乘低精度
string ch(string s,int a){
int n,m,t=0;
int x[100005]={0};
int z[100005]={0};
string s1;
n=s.size();
for(int i=0;i<n;i++){
x[i]=s[n-1-i]-'0';
}
for(int i=0;i<n;i++){
z[i]=x[i]*a+t;
t=z[i]/10;
z[i]=z[i]%10;
}
int c=0;
while(t!=0){
c++;
z[n+c-1]=t%10;
t/=10;
}
n+=c;
for(int i=0;i<n;i++){
s1=char(z[i]+48)+s1;
}
return s1;
}
然后就是递推了。
最终代码
#include<bits/stdc++.h>
using namespace std;
string a[1005]={"1","2"};
int s=0,k=0;
string ch(string s,int a){//高精度乘低精度
int n,m,t=0;
int x[100005]={0};
int z[100005]={0};
string s1;
n=s.size();
for(int i=0;i<n;i++){
x[i]=s[n-1-i]-'0';
}
for(int i=0;i<n;i++){
z[i]=x[i]*a+t;
t=z[i]/10;
z[i]=z[i]%10;
}
int c=0;
while(t!=0){
c++;
z[n+c-1]=t%10;
t/=10;
}
n+=c;
for(int i=0;i<n;i++){
s1=char(z[i]+48)+s1;
}
return s1;
}
string ja(string a1,string b1){//高精度加法
int n=a1.size(),m=b1.size(),a[10005]={},b[10005]={},c[10005]={},k,i,x;
string s;
for(i=0;i<n;i++) a[n-i]=a1[i]-'0';
for(i=0;i<m;i++) b[m-i]=b1[i]-'0';
k=1;
x=0;
while(k<=n||k<=m){
c[k]=a[k]+b[k]+x;
x=c[k]/10;
c[k]%=10;
k++;
}
c[k]=x;
if(c[k]==0)k--;
for(i=k;i>=1;i--)s+=c[i]+'0';
return s;
}
int main(){
int n;
cin>>n;
for(int i=2;i<n;i++){//递推
a[i]=ja(ch(a[i-1],2),a[i-2]);
}
cout<<a[n-1];
return 0;
}
完成!