找到规律。你会发现a(n)的值是a(n-2)中的1和00确定的。
因为01->1001,而1->01,00->1010。故列出a(n)=a(n-2)+2^(n-3),再推出a(n)=a(n-1)+2*a(n-2)。
注:这题的大数处理有点步骤可以省略,因为我们的递推式只是乘2。
有包含完整的乘和加的大数步骤的本题链接http://blog.csdn.net/lishuhuakai/article/details/9277115
//a[n]=a[n-1]+2*a[n-2]
#include<stdio.h>
#include<string.h>
using namespace std;
char a[1001][1001];
void change()
{
int i,j;
for(i=4;i<=1000;i++)
{
memset(a[i],'0',1001);
for(j=0;j<=1000;j++)//每位代入公式
{
a[i][j]+=(a[i-1][j]-'0')+(a[i-2][j]-'0')+(a[i-2][j]-'0');
}
for(j=0;j<=1000;j++)
{
if(a[i][j]>'9')//进位
{
a[i][j+1]+=(a[i][j]-'0')/10;
a[i][j]=(a[i][j]-'0')%10+'0';
}
}
}
}
int main()
{
int i,j,n;
memset(a[1],'0',1001);memset(a[2],'0',1001);
memset(a[3],'0',1001);
a[2][0]='1';a[3][0]='1';
change();
while(~scanf("%d",&n))
{
if(n==1)
{
printf("0\n");
}
else
{
for(i=1000;i>=0;i--)
if(a[n][i]!='0'){j=i;break;}
for(i=j;i>=0;i--)printf("%c",a[n][i]);
printf("\n");
}
}
return 0;
}