题目链接:
数制转换https://www.nowcoder.com/share/jump/437195121691734210665
描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。 不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
输入描述:
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。 数据可能存在包含前导零的情况。
输出描述:
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
示例1
输入:
15 Aab3 7
输出:
210306
思路:
-
读入原进制 a、数字字符串 s 和目标进制 b。
-
将数字字符串按权展开转换为十进制数值 num,num 初始值为 0。
-
将十进制数值 num 按目标进制 b 转换为字符,将字符添加到结果字符串 res 中。
-
反转结果字符串 res 得到正确的转换结果。
-
输出转换后的结果。
源代码:
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;// 将字符 c 转换为对应的十进制数值
int CharToInt(char c) {if (c >= '0' && c <= '9') {return c - '0'; // '0' 的 ASCII 值为 48,减去 '0' 后得到数值}else if (c >= 'a' && c <= 'f') {return c - 'a' + 10; // 'a' 的 ASCII 值为 97,减去 'a' 后加上 10 得到数值}else{return c - 'A' + 10; // 'A' 的 ASCII 值为 65,减去 'A' 后加上 10 得到数值}
}// 将整数 n 转换为对应的字符
char IntToChar(int n) {if (n >= 0 && n <= 9) {return n + '0'; // 数值加上 '0' 的 ASCII 值即为对应字符}else {return n - 10 + 'A'; // 数值减去 10 后加上 'A' 的 ASCII 值即为对应字符}
}int main()
{int a, b; // a:原进制,b:目标进制string s; // 输入的数字字符串while (cin >> a >> s >> b) {long num = 0; // 初始化十进制数值for (int i = s.size() - 1; i >= 0; i--) {num += CharToInt(s[i]) * pow(a, s.size() - 1 - i); // 将输入的数字字符串按权展开转换为十进制数值}string res = ""; // 初始化目标进制的结果字符串while (num != 0) {res += IntToChar(num % b); // 将十进制数值按目标进制转换为字符并添加到结果字符串中num /= b; // 取商继续处理}reverse(res.begin(), res.end()); // 反转结果字符串得到正确的转换结果cout << res << endl; // 输出结果}return 0;
}
提交结果: