任意进制的相互转换

编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。

这里有62个不同数位{0-9,A-Z,a-z}。

输入格式
第一行输入一个整数,代表接下来的行数。

接下来每一行都包含三个数字,首先是输入进制(十进制表示),然后是输出进制(十进制表示),最后是用输入进制表示的输入数字,数字之间用空格隔开。

输入进制和输出进制都在2到62的范围之内。

(在十进制下)A = 10,B = 11,…,Z = 35,a = 36,b = 37,…,z = 61 (0-9仍然表示0-9)。

输出格式
对于每一组进制转换,程序的输出都由三行构成。

第一行包含两个数字,首先是输入进制(十进制表示),然后是用输入进制表示的输入数字。

第二行包含两个数字,首先是输出进制(十进制表示),然后是用输出进制表示的输入数字。

第三行为空白行。

同一行内数字用空格隔开。

输入样例:

8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030

输出样例:

62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001
10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A
35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05
23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj
49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S
61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030
5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

//位数太高直接用字符串输出
int main ()
{
    int cnt;
    cin >> cnt;
    while (cnt --)
    {
        int a, b;//将a进制转换成b进制
        string num1_line, num2_line;//a进制的字符串和b进制的字符串
        vector<int> num1, num2;
        cin >> a >> b >> num1_line;
        //将num1变成数组的形式
        for (int i = 0; i < num1_line.size(); i ++)
        {
            if(num1_line[i]<= '9' && num1_line[i] >= '0') num1.push_back(num1_line[i] - '0');
            if(num1_line[i]<= 'Z' && num1_line[i] >= 'A') num1.push_back(num1_line[i] - 'A' + 10);
            if(num1_line[i]<= 'z' && num1_line[i] >= 'a') num1.push_back(num1_line[i] - 'a' + 36);
        }
        reverse(num1.begin(), num1.end());
        //短除num1
        while (num1.size())
        {
            int t = 0;//剩余的余数
            for (int i = num1.size() - 1; i >= 0; i --)
            {
                num1[i] += t * a;
                t = num1[i] % b;
                num1[i] /= b;
            }
            num2.push_back(t);
            while (num1.size() && num1.back() == 0)
                num1.pop_back();
        }
        reverse(num2.begin(), num2.end());
        //将数组转换为字符串
        for (int i = 0; i < num2.size(); i ++)
        {
            if(num2[i] <= 9) num2_line += char(num2[i] + '0');
            if(num2[i] <= 35 && num2[i] >= 10) num2_line += char(num2[i] - 10 + 'A');
            if(num2[i] <= 61 && num2[i] >= 36) num2_line += char(num2[i] - 36 + 'a');
        }
        cout << a << ' ' << num1_line << endl;
        cout << b << ' ' << num2_line << endl;
        cout << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyzhang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值