《算法竞赛进阶指南》数的进制转换

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

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

输入格式

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

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

输入进制和输出进制都在 22 到 6262 的范围之内。

(在十进制下)A=10,B=11,…,Z=35,a=36,b=37,…,z=61A=10,B=11,…,Z=35,a=36,b=37,…,z=61 (0−90−9 仍然表示 0−90−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 <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        int a, b;
        string a_line, b_line;
        cin >> a >> b >> a_line;
        
        vector<int> number;
        for (int i = 0; i < a_line.size(); i ++ )//将所有字符转化为对应的数字
        {
            char c = a_line[i];
            if (c >= '0' && c <= '9') number.push_back(c - '0');
            if (c >= 'A' && c <= 'Z') number.push_back(c - 'A' + 10);
            if (c >= 'a' && c <= 'z') number.push_back(c - 'a' + 36);
        }
        
        reverse(number.begin(), number.end());//翻转reverse是为了方便除去除法的前导0
        
        vector<int> res;
        while (number.size())
        {
            int mod = 0;//mod为余数
            for (int i = number.size() - 1; i >= 0; i -- )//短除法
            {
                number[i] += mod * a;
                mod = number[i] % b;
                number[i] /= b;
            }
            
            res.push_back(mod);
            while (number.size() && !number.back()) number.pop_back();//若不反转number则这里则需要
        }//从前往后枚举,很麻烦
        
        reverse(res.begin(), res.end());//翻转回来
        
        for (auto ans : res)
        {
            if (ans >= 0 && ans <= 9) b_line += char(ans + '0');
            if (ans >= 10 && ans <= 35) b_line += char(ans - 10 + 'A');
            if (ans >= 36 && ans <= 61) b_line += char(ans - 36 + 'a');
        }
        
        cout << a << ' ' << a_line << endl;
        cout << b << ' ' << b_line << endl;
        cout << endl;
    }
    
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

啥也不会hh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值