#include<stdio.h>
int a[2000][200]={0};//这里数组开大点就行了,一般不会出现问题
int main()
{
int n,t;
int i,j;
a[1][0]=1;
a[2][0]=1;
a[3][0]=2;
a[4][0]=3;
for(i=5;i<2000;i++)
{
for(j=0;j<200;j++)
{
a[i][j]+=a[i-1][j]+a[i-2][j];
}
for(j=0;j<200;j++)
{
if(a[i][j]>10000000)
{
a[i][j+1]+=a[i][j]/10000000;
a[i][j]=a[i][j]%10000000;
}
}
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(j=199;j>=0;j--)
{
if(a[n][j]!=0)
break;
}
printf("%d",a[n][j]);
for(j=j-1;j>=0;j--)
printf("%07d",a[n][j]);
printf("\n");
}
return 0;
}下面的代码理解起来更加简单
<pre name="code" class="cpp">#include<stdio.h>
int a[2000][1000]={0};//本来这里是a[10000][260]的,我改了下,结果这里260要变成500了,考虑下存储的时候会出现问题就行了
int main()
{
int n,t;
int i,j;
a[1][0]=1;
a[2][0]=1;
a[3][0]=2;
a[4][0]=3;
for(i=5;i<2000;i++)
{
for(j=0;j<1000;j++)
{
a[i][j]+=a[i-1][j]+a[i-2][j];
}
for(j=0;j<1000;j++)
{
if(a[i][j]>=10)
{
a[i][j+1]+=a[i][j]/10;
a[i][j]=a[i][j]%10;
}
}
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(j=999;j>=0;j--)
{
if(a[n][j]!=0)
break;
}
printf("%d",a[n][j]);
for(j=j-1;j>=0;j--)
printf("%d",a[n][j]);
printf("\n");
}
return 0;
}