acwing 124. 数的进制转换

该博客详细介绍了如何实现一个程序,将数字从一种进制转换为另一种进制,涉及的进制范围从2到62。内容包括输入输出格式的说明,以及具体转换算法的解释,即通过不断取模和除法得到新的进制表示。还提及了在编程过程中使用`auto`关键字的经验分享和细节注意事项。

编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。
这里有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

a进制数A转化为b进制数B,A每位表示为xn,xn-1…x2,x1; 转化后x1=A mod b;x2=[A/b] mod b;x3 = [A/b^2] mod b;…

也就是短除法,每次对上一次的结果除要转化的进制拿出余数;
这里直接用一个number保存原数组,每次在上面找余数
顺便学习了auto的用法
还是注意细节

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        int a,b;
        string sa,sb;
        cin >> a >> b >> sa;
        vector<int>number;
        for(auto c : sa)
        {
            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());
        vector<int>res;
        while(number.size())
        {
            int r = 0;//上一次运算后的余数
            for(int i = number.size() - 1; i >= 0;i--)//每次对number整除b
            {
                number[i] += r * a;
                r = number[i] % b;
                number[i] /= b;
            }
            res.push_back(r);//收集余数
            while(number.size() && number.back() == 0)number.pop_back();
        }

        reverse(res.begin(), res.end());
        for(auto x : res)
        {
            if(x <= 9)sb += char(x + '0');
            if(x >= 10 && x<= 35)sb += char(x - 10 + 'A');
            if(x >= 36)sb += char(x - 36 + 'a');
        }
        cout << a << ' ' << sa << endl << b << ' ' << sb;
        cout << endl << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值