题目链接:http://poj.org/problem?id=2506
源代码:
#include<iostream>
using namespace std;
int main()
{
int i,j;
long long a[64]; //存储前63个
int b[200][255]; //存储后187个
int len[200];
//存储后187个的长度
a[0]=1; //当n=0的时候,结果为1奥
a[1]=1;
a[2]=3;
for(i=3;i<64;i++)
if(i%2==0) a[i]=a[i-1]*2+1; //当偶数时,结果为前面的二倍加一
else a[i]=a[i-1]*2-1; //当奇数时,为二倍减一
memset(b,0,sizeof(b));
long long mid=a[63]; //把n=63的时候,赋值给b【0】
int q=0;
while(mid>0)
{
b[0][q++]=mid%10;
mid/=10;
}
len[0]=q;
int mid1;
int p;
for(i=1;i<200;i++)
{
if(i%2==1) mid1=b[i-1][0]*2+1; //处理最低位
else mid1=b[i-1][0]*2-1;
if(mid1>=10)
{
b[i][0]+=mid1%10;
b[i][1]+=mid1/10;
}
else b[i][0]=mid1;
q=1;
p=1;
while(q<len[i-1])
{
mid1=b[i-1][q]*2;
if(mid1>=10)
{
b[i][p]+=mid1%10;
b[i][p+1]+=mid1/10;
if(q==len[i-1]-1) p++;
}
else b[i][p]+=mid1;
q++;
p++;
}//end while
len[i]=p;
} //end for
/*for(i=0;i<40;i++)
{
for(j=len[i]-1;j>=0;j--)
cout<<b[i][j];
cout<<endl;
}*/
int n;
while(cin>>n)
{
if(n<64)
cout<<a[n]<<endl;
else
{
for(j=len[n-63]-1;j>=0;j--)
cout<<b[n-63][j];
cout<<endl;
}
}
}