考研机试第三天

##六.进制转换
问题7:将M(2<=M)进制的数X转换为N(N<=36)进制的数输出

#include<stdio.h>
#include<string>
#define maxDigits 100
struct bigInterger{
       int digit[masDigits];
       int size;
       void init(){
            for(int i = 0;i < maxDigits;i++)  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]);
            }
            printf("\n");
        }
        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 bigInterger &A) const{//高精度整数之间的加法运算
            bigInteger ret;
            ret.init();
            int carry = 0;
            for(int i = 0;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;
                int r = (remainder*10000+digit[i])%x;
                ret.digit[i] = t;//保存本位的值
                remainder = r;//保存至本位为止的余数
            }
            ret.size = 0;//返回高精度整数的size初始值为0,即当所有位数字都为0时,digit[0]代表数字0,作为最高有效位,高精度整数即为数字0
            for(int i = 0;i<maxDigits;i++){
               if(digit[i] != 0;) ret.size = i;
            }//若存在非0位,则最高位的非0位作为最高有效位
            ret.size++;//最高有效位的下一位即为下一个不曾使用的digit数组单元,确定为size的值
            return ret;
      }
   int operator % (int x) const{ //高精度整数对普通整数求余数
       int operator = 0;
       for(int i = size - 1;i >= 0;i--){
          int t = (remainder*10000+digit[i])/x;
          int r = (remainder*10000+digit[i])%x;
          remiander = x;
       }//过程同高精度整数对普通整数求商
       return remainder;
    }
 }a,b,c;
 char str[10000];
 char ans[10000];
 int main(){
     int n,m;
     while(scanf("%d%d",&m,&n) != EOF){
          scanf("%s",str);    //输入m进制数
          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{
           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;
}

注意:高精度整数不能再在常数时间里得到结果,由于其高精度运算需要计算每一位的和,所以该运算复杂度变为O(size),其中size为两个数中较多的位数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值