• AcWing 3438. 数制转换


    求任意两个不同进制非负整数的转换(22 进制 ∼∼ 1616 进制),所给整数在 int 范围内。

    不同进制的表示符号为(0,1,…,9,a,b,…,f0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F0,1,…,9,A,B,…,F)

    输入格式

    输入只有一行,包含三个整数 a,n,b。a 表示其后的 n 是 a 进制整数,b 表示欲将 a 进制整数 nn 转换成 bb 进制整数。

    a,ba,b 是十进制整数。

    数据可能存在包含前导零的情况。

    输出格式

    输出包含一行,该行有一个整数为转换后的 bb 进制数。

    输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F0,1,…,9,A,B,…,F)。

    数据范围

    2≤a,b≤162≤a,b≤16,
    给定的 a 进制整数 n 在十进制下的取值范围是 [1,2147483647][1,2147483647]。

    输入样例:

    15 Aab3 7
    

    输出样例:

    210306

     题目大意:

    将a进制整数n转换为b进制整数

     思路:

    以10进制为中心 先将a进制转换为10进制 再把转换后的十进制转换为b进制

     任意进制数转换为10进制

    1. int toTen(int a, string num) //a进制数num转换为10进制
    2. {
    3. int ans = 0;
    4. int n = num.size();
    5. for (int i = 0; i < num.size(); i++) {
    6. if (isupper(num[i]))
    7. ans += pow(a, n - i - 1) * (num[i] - 'A' + 10);
    8. else if (islower(num[i]))
    9. ans += pow(a, n - i - 1) * (num[i] - 'a' + 10);
    10. else if (isdigit(num[i]))
    11. ans += pow(a, n - i - 1) * (num[i] - '0');
    12. }
    13. return ans;
    14. }

     十进制数转任意进制

    1. unordered_map<int, char> mp = {
    2. {0, '0'}, {1, '1'}, {2, '2'}, {3, '3'},
    3. {4, '4'}, {5, '5'}, {6, '6'}, {7, '7'},
    4. {8, '8'}, {9, '9'}, {10, 'A'}, {11, 'B'},
    5. {12, 'C'}, {13, 'D'}, {14, 'E'}, {15, 'F'}
    6. };
    7. string toB(int num, int b) { //10进制数num转换为b进制
    8. string ans;
    9. while(num >= b) {
    10. ans += mp[num % b];
    11. num /= b;
    12. }
    13. if(num != 0) ans += mp[num];
    14. reverse(ans.begin(), ans.end());
    15. return ans;
    16. }

     AC代码1:

    1. #include <iostream>
    2. #include <unordered_map>
    3. #include <algorithm>
    4. #include <cmath>
    5. using namespace std;
    6. unordered_map<int, char> mp = {
    7. {0, '0'}, {1, '1'}, {2, '2'}, {3, '3'},
    8. {4, '4'}, {5, '5'}, {6, '6'}, {7, '7'},
    9. {8, '8'}, {9, '9'}, {10, 'A'}, {11, 'B'},
    10. {12, 'C'}, {13, 'D'}, {14, 'E'}, {15, 'F'}
    11. };
    12. int toTen(int a, string num) //a进制数num转换为10进制
    13. {
    14. int ans = 0;
    15. int n = num.size();
    16. for (int i = 0; i < num.size(); i++) {
    17. if (isupper(num[i]))
    18. ans += pow(a, n - i - 1) * (num[i] - 'A' + 10);
    19. else if (islower(num[i]))
    20. ans += pow(a, n - i - 1) * (num[i] - 'a' + 10);
    21. else if (isdigit(num[i]))
    22. ans += pow(a, n - i - 1) * (num[i] - '0');
    23. }
    24. return ans;
    25. }
    26. string toB(int num, int b) { //10进制数num转换为b进制
    27. string ans;
    28. while(num) {
    29. ans += mp[num % b];
    30. num /= b;
    31. }
    32. reverse(ans.begin(), ans.end());
    33. return ans;
    34. }
    35. int main() {
    36. int a, b;
    37. string n;
    38. cin >> a >> n >> b;
    39. int num = toTen(a, n);
    40. cout << toB(num, b);
    41. return 0;
    42. }

     

    简洁版:

    1. /*
    2. * @Author: Spare Lin
    3. * @Project: AcWing2022
    4. * @Date: 2022/6/30 21:26
    5. * @Description: 3438. 数制转换 来源:北京大学考研机试题
    6. */
    7. #include <iostream>
    8. #include <algorithm>
    9. using namespace std;
    10. int main() {
    11. int a, b;
    12. string n;
    13. cin >> a >> n >> b;
    14. int res = 0; //a进制转换为十进制
    15. for (auto &x: n) {
    16. if(isupper(x)) res = res * a + x - 'A' + 10;
    17. if(islower(x)) res = res * a + x - 'a' + 10;
    18. if(isdigit(x)) res = res * a + x - '0';
    19. }
    20. string ans; //十进制转换为b进制
    21. while (res) {
    22. int tmp = res % b;
    23. if(tmp >= 10)
    24. ans += char(tmp + 'A' - 10);
    25. else
    26. ans += char(tmp + '0');
    27. res /= b;
    28. }
    29. reverse(ans.begin(), ans.end());
    30. cout << ans << '\n';
    31. return 0;
    32. }

  • 相关阅读:
    Map获取其键和值
    浅谈电弧光保护在10kV变电站高压室的应用方案
    django 项目基本配置
    optee编译TA时的属性配置和设置
    前端领域的插件式设计
    Java8新特性
    java-构造方法(超详细,奶奶都能看懂)
    资源分享 | 情绪脑电研究公开数据集
    Small RTOS51 学习笔记(1)使用 RTOS 的好处
    多台群晖实现按计划WOL网络自动唤醒数据冷备份
  • 原文地址:https://blog.csdn.net/weixin_55664293/article/details/125566099