问题 D: 进制转换

题目描述
将M进制的数X转换为N进制的数输出。

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

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

样例输入

10 2
11

样例输出

1011

提示
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。

思路:参考我之前写的一篇文章思路:大数的进制转换

需要注意的是:假设输入里含有字母,比如A,则需要将A转换为10对应的ASCII码,ASCII码表里’9’的下一位是分号’:’,所以这里就将分号’:‘等价于数字10的ASCII码,‘B’对应11,11对应到’;’,后续依次类推。在运算过程中将’:'减去’0’也就还原得到了10这个数字。最后输出的时候如果有大于9的数,再转换成对应字母即可。

#include <cstdio>
#include <cstring>

char num[1010], ans[1010];

void trans(int a, char num[], int b) { //进制a的数num转换为进制b
    int len = strlen(num);
    int i, j, m, n, k = 0;
    for (i = 0; i < len; i++) {
        if (num[i] >= 'A' && num[i] <= 'Z') {
            num[i] = num[i] - 'A' + '9' + 1; //将字母输入转换成对应数字的ASCII码
        }
    }
    for (i = 0; i < len;) {
        m = 0;
        for (j = i; j < len; j++) {
            n = (m * a + num[j] - '0') % b; //当前这轮的余数
            num[j] = (m * a + num[j] - '0') / b + '0'; //变更当前位的数
            m = n; //把余数传给下一位
        }
        ans[k++] = char(m + '0'); //记录该轮的余数
        while (num[i] == '0') { //仅当最高位变成0时才移到下一位
            i++;
        }
    }
    for (i = k - 1; i >= 0; i--) { //从后往前输出余数
        if (ans[i] >= '0' && ans[i] <= '9') {
            printf("%c", ans[i]);
        } else {
            printf("%c", ans[i] - 1 - '9' + 'a'); //大于9的数转换成对应字母
        }
    }
    printf("\n");
}

int main() {
    int m, n, cnt;
    while (scanf("%d %d", &m, &n) != EOF) {
        scanf("%s", num);
        trans(m, num, n);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值