本文由晨之子发表在破碎·永恒
Code:
#include <cstdio>
#define MAXLEN 1000class Num
{
protected:
int num[MAXLEN];
int base;
int length;
public:
Num();
~Num();
void converse(int new_base);
void init_base();
void init_num();
void print();
};Num::Num()
{
memset(num,0,sizeof(num));
length=0;
base=0;
}Num::~Num()
{
}void Num::init_base()
{
scanf(“%d”,&base);
return;
}void Num::init_num()
{
char ch;
int i;
length=0;
memset(num,0,sizeof(num));
scanf(“%c”,&ch);
while (ch!=’\n’)
{
while (ch==’ ‘) scanf(“%c”,&ch);
for (i=0;i<62;i++) if (ch==digits[i]) num[length]=i;
length++;
scanf(“%c”,&ch);
}
for (i=0;i<length/2;i++)
{
num[i]=num[i]+num[length-i-1];
num[length-i-1]=num[i]-num[length-i-1];
num[i]=num[i]-num[length-i-1];
}
return;
}void Num::print()
{
int i;
printf(“%d “,base);
for (i=length-1;i>=0;i–) printf(“%c”,digits[num[i]]);
printf(“\n”);
return;
}void Num::converse(int new_base)
{
int new_num[MAXLEN+1];
int power[MAXLEN+1];
int new_length;
int i;
memset(power,0,sizeof(power));
memset(new_num,0,sizeof(new_num));
power[0]=1;
new_num[0]+=num[0]*power[0];
for (i=0;i<MAXLEN;i++)
if (new_num[i]>=new_base)
{
new_num[i+1]+=new_num[i]/new_base;
new_num[i]%=new_base;
}
for (i=1;i<length;i++)
{
int temp[MAXLEN+1];
int j;
memset(temp,0,sizeof(temp));
for (j=0;j<MAXLEN;j++) power[j]*=base;
for (j=0;j<MAXLEN;j++)
if (power[j]>=new_base)
{
power[j+1]+=power[j]/new_base;
power[j]%=new_base;
}
for (j=0;j<MAXLEN;j++)
temp[j]=power[j]*num[i];
for (j=0;j<MAXLEN;j++)
if (temp[j]>=new_base)
{
temp[j+1]+=temp[j]/new_base;
temp[j]%=new_base;
}
for (j=0;j<MAXLEN;j++)
{
new_num[j]+=temp[j];
if (new_num[j]>=new_base)
{
new_num[j+1]+=new_num[j]/new_base;
new_num[j]%=new_base;
}
}
}
new_length=MAXLEN;
while ((new_num[new_length-1]==0)&&(new_length>1)) new_length–;
for (i=0;i<MAXLEN;i++)
num[i]=new_num[i];
base=new_base;
length=new_length;
return;
}