进制转换——高精度整数(王道)

题目描述:

将M进制的数X转换为N进制的数输出。

输入:

输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。

输出:

输出X的N进制表示的数。

样例输入:
16 10
F
样例输出:
15
#include <iostream>
#include<cstdio>
#include<string.h>
#define MaxDigits 100
using namespace std;
struct bigInteger{//高精度整数结构体
    int digit[MaxDigits];
    int size;

    void init(){//初始化
        memset(digit,0,sizeof(digit));
        size=0;
    }

    void set(int x){//初始化高精度整数
        init();
        do{
            digit[size++] = x%10000;
            x /= 10000;
        }while(x!=0);
    }

    void output(){//输出
        for(int i=size-1;i>=0;i--){
            if(i!=size-1)
                printf("%04d",digit[i]);
            else
                printf("%d",digit[i]);
        }
    }

    bigInteger operator * (int x) const{//高精度整数与普通整数的乘积
        bigInteger ret;
        ret.init();
        int carry=0;
        for(int i=0;i<size;i++){
            int tmp=x*digit[i]+carry;
            carry=tmp/10000;
            tmp%=10000;
            ret.digit[ret.size++]=tmp;
        }
        if(carry!=0)
            ret.digit[ret.size++]=carry;
        return ret;
    }

    bigInteger operator + (const bigInteger &A) const{//高精度整数之间的加法
        bigInteger ret;
        ret.init();
        int carry=0;
        for(int i=0;i<A.size || i<size;i++){
            int tmp=A.digit[i]+digit[i]+carry;
            carry=tmp/10000;
            tmp%=10000;
            ret.digit[ret.size++]=tmp;
        }
        if(carry!=0)
            ret.digit[ret.size++]=carry;
        return ret;
    }

    bigInteger operator / (int x) const{//高精度整数除以普通整数
        bigInteger ret;
        ret.init();
        int remainder=0;//余数
        for(int i=size-1;i>=0;i--){//从最高位至最低位依次完成计算
            int t=(remainder*10000+digit[i])/x;//计算当前位数值加上高位剩余的余数的和对x求得的商
            int r=(remainder*10000+digit[i])%x;//计算当前位数值加上高位剩余的余数的和对x求模后得的余数
            ret.digit[i]=t;//保存本位的值
            remainder=r;//保存至本位为止的余数
        }
        ret.size=0;
        for(int i=0;i<MaxDigits;i++){
            if(digit[i]!=0)
                ret.size=i;
        }
        ret.size++;//计算ret的大小
        return ret;
    }

    int operator % (int x) const{//高精度整数对普通整数求余数
        int remainder=0;
        for(int i=size-1;i>=0;i--){
            //int t=(remainder*10000+digit[i])/x;
            int r=(remainder*10000+digit[i])%x;
            remainder=r;
        }
        return remainder;
    }
}a,b,c;


char str[10000];
char ans[10000];

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    scanf("%s",str);
    int L=strlen(str);
    a.set(0);//a初始值为0,用来保存转换为十进制的m进制数
    b.set(1);//b初始值为1,在m进制向十进制转换的过程中,依次表示每一位的权重
    for(int i=L-1;i>=0;i--){
        int t;
        if(str[i]>='0' && str[i]<='9')//确定当前位字符代表的数字
            t=str[i]-'0';
        else
            t=str[i]-'A'+10;
        a=a+b*t;//累加当前数字乘当前位权重的积
        b=b*m;//计算下一位的权重
    }
    int size=0;//转换为n进制后的字符个数
    do{//对转换后的十进制数求其n进制值
        int t=a%n;//求余数
        if(t>=10)//确定当前位字符
            ans[size++]=t-10+'a';
        else
            ans[size++]=t+'0';
        a=a/n;//求商
    }while(a.digit[0]!=0 || a.size!=1);
    for(int i=size-1;i>=0;i--)
        printf("%c",ans[i]);
    printf("\n");
    return 0;
}

 

posted @ 2018-03-17 11:39  Shaw_喆宇  阅读(461)  评论(0编辑  收藏  举报