思路:首先想到的是把乘法化加法,逐步计算后500位,代码很简单,唯一的缺点就是每次提交都是超时,嘿嘿..后来看书竟然发现原来求长度有个很好的方法p*log10(2),系统函数库果真强大。然后就是有一个公式可以把2的p次幂化为二进制求法,如果p的二进制某位为0,自然少了计算过程。
#include <cmath>
#include <iostream>
using namespace std;
#define MAX 125

unsigned int num[MAX];
unsigned int key[MAX];

void multiply(unsigned int* num,unsigned int* key)


{
unsigned int temp[MAX];
memset(temp,0,sizeof temp);

for (int i=0;i<MAX;i++)

{
int nCarry = 0;
for (int j=0;j<MAX-i;j++)

{
int nTmp = temp[i+j] + num[j]*key[i] + nCarry;
temp[i+j] = nTmp%10000;
nCarry = nTmp/10000;
}
}

memcpy(num,temp,sizeof(unsigned int)*MAX);
}

int main()


{
int m;
cin>>m;
//use the math.h ,perfect
cout<<(int)(m*log10(2.0F)+1)<<endl;
memset(num,0,sizeof num);
memset(key,0,sizeof key);
num[0] = 1;
key[0] = 2;

while (m>0)

{
if (m&1)

{
multiply(num,key);
}
multiply(key,key);

m >>= 1;
}
num[0]--;


for (int i=MAX-1;i>=0;i--)

{
if (i%25==12)

{
printf("%02d\n%02d",num[i]/100,num[i]%100);
// cout<<'.';
}
else

{
printf("%04d",num[i]);
if (i%25==0)

{
cout<<endl;
// cout<<num[i]<<endl;
}
}
}

return 0;
}
