题目大意:首先题目给出一个十分相似于斐波那契数列的一个数列规则,在这个数列中,前四个数字为1,当下标大于4时,则此数等于前面四个数之和。因为题目要求是答案不超过2000位,所以很容易发现是考察高精度的问题。本来这种斐波那契的题目都是打表来做,但是刚开始感觉无从下手,如果不打表感觉也会超时,后来想到用二维数组f【m】【n】,代表第m个数的第n位的数字。额,感觉也是用了打表,然后就是普通 的高精度了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 2100
char f[10005][maxn];
int main(){
int n;
memset(f,0,sizeof(f));
f[1][2010]=1;
f[2][2010]=1;
f[3][2010]=1;
f[4][2010]=1;
int i=5,p=2010;
while(f[i-1][5]<=1){
for(int j=2010;j>=0;j--){
f[i][j]=f[i-1][j]+f[i-2][j]+f[i-3][j]+f[i-4][j];
}
for(int j=2010;j>=p;j--){
int a=f[i][j];
f[i][j-1]+=a/10;
f[i][j]=a%10;
}
if(f[i][p-1]>0)
p--;
i++;
}
int t;
while((scanf("%d",&n))!=EOF){
for(int i=0;i<=2010;i++){
if(f[n][i]+'0'!='0'){
t=i;break;
}
}
for(int i=t;i<=2010;i++){
printf("%c",f[n][i]+'0');
}
printf("\n");
}
return 0;
}