思路:首先想到的是把乘法化加法,逐步计算后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;
}