分析:大数模拟和找规律。
#include<iostream>
using namespace std;
char f[1001][501];
/*
从下面的步骤中可以看出,下一步的后半部分是前一步的整个串,所以对于后半部分有f[n]=f[n-1];
从前半部分和整体可以看出,另一部分有f[n]=f[n-1]-1(奇数步),f[n]=f[n-1]+1(偶数步)。
step0:1 f[0]=0
step1:01 f[1]=0
step2:10 01 f[2]=1 =2*f[1]+1
step3:0110 1001 f[3]=1 =2*f[2]-1
step4:10010110 01101001 f[4]=3 =2*f[3]+1
step5:0110100110010110 1001011001101001 f[5]=5 =2*f[4]-1
step6:10010110011010010110100110010110 01101001100101101001011001101001 f[6]=11 =2*f[5]+1
最终有f[n]=2*f[n-1]+1(n为偶数),f[n]=2*f[n-1]-1(n为奇数)
*/
void createtable()
{
int i,j;
int c,fa,sum;
memset(f,0,sizeof(f));
for(i=2;i<=1000;i++)
{
if(i%2==0)
{
for(j=500,c=0;j>=0;j--)
{
fa=f[i-1][j]*2+c;
f[i][j]=fa%10;
c=fa/10;
}
j=500;
sum=f[i][j]+1;
f[i][j]=sum%10;
c=sum/10;
while(c)
{
sum=f[i][j-1]+c;
f[i][j-1]=sum%10;
c=sum/10;
j--;
}
}
else
{
for(j=500,c=0;j>=0;j--)
{
fa=f[i-1][j]*2+c;
f[i][j]=fa%10;
c=fa/10;
}
j=500;
sum=f[i][j]+-1;
if(sum==-1)
{
f[i][j]=9;
c=-1;
}
else
{
f[i][j]=sum;
c=0;
}
while(c==-1)
{
sum=f[i][j-1]+c;
if(sum==-1)
{
f[i][j]=9;
c=-1;
}
else
{
f[i][j]=sum;
c=0;
}
j++;
}
}
}
}
int main()
{
int n,j;
createtable();
while(cin>>n)
{
if(n==1)
cout<<"0"<<endl;
else
{
j=0;
while(f[n][j]==0) j++;
for(;j<=500;j++)
putchar(f[n][j]+'0');
putchar('\n');
}
}
return 0;
}HDU ACM 1041Computer Transformation(大数模拟+找规律)
原文地址:http://blog.csdn.net/a809146548/article/details/45308551