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


    题目描述:

    将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("
    ");
        return 0;
    }
  • 相关阅读:
    FastJson--阿里巴巴公司开源的速度最快的Json和对象转换工具
    如何去设计一个自适应的网页设计或HTMl5
    教育行业SaaS选型 需要注意的三点问题
    SaaS系列介绍之十五: SaaS知识重用
    SaaS系列介绍之十四: SaaS软件开发分析
    SaaS系列介绍之十三: SaaS系统体系架构
    SaaS系列介绍之十二: SaaS产品的研发模式
    个人总结
    用例图设计
    第二次结对作业
  • 原文地址:https://www.cnblogs.com/xym4869/p/8587281.html
Copyright © 2020-2023  润新知