[转]进制转换_C++

本文由晨之子发表在破碎·永恒

Code:

#include <cstdio>
#define MAXLEN 1000

class 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;
}

发布者:巫山霏云

巫山霏云,87年生巨蟹,文科生,IT男,喜读书,不求甚解,

留下评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据