题目链接:
KY80 进制转换https://www.nowcoder.com/share/jump/437195121691735660774
描述
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串(注意可能存在的一个测试用例里的多组数据)。
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
示例1
输入:
0xA
输出:
10
思路:
-
读入十六进制数值字符串 s。
-
初始化结果字符串 res 为 "0",表示最终的十进制结果。
-
从字符串的第三位开始遍历,即从十六进制数值的有效部分开始,因为前两位为 "0x" 表示十六进制前缀。
-
在遍历过程中,先将结果字符串 res 乘以 16,相当于将十六进制数值左移 4 位。
-
再将当前字符代表的值加到结果字符串 res 中,通过调用 Add 函数实现。
-
输出最终的十进制结果。
源代码:
#include <iostream>
#include <string>
using namespace std;
// 将十六进制字符转换为对应的整数
int CharToInt(char c) {
if (c >= '0' && c <= '9') {
return c - '0'; // 数字字符直接转换
} else {
return c - 'A' + 10; // 字母字符转换,a 对应 10,b 对应 11,依此类推
}
}
// 将字符串表示的十六进制数与整数 x 相乘
string multiple(string str, int x) {
int carry = 0; // 进位
string result; // 存放结果
for (int i = str.size() - 1; i >= 0; i--) {
int current = x * CharToInt(str[i]) + carry; // 计算当前位的结果
result = char(current % 10 + '0') + result; // 将当前位的结果插入到结果的前面
carry = current / 10; // 更新进位
}
while (carry != 0) {
result = char(carry % 10 + '0') + result; // 处理剩余的进位
carry /= 10;
}
return result;
}
// 将字符串表示的十六进制数与整数 x 相加
string Add(string str, int x) {
int carry = x; // 初始进位为 x
string result; // 存放结果
for (int i = str.size() - 1; i >= 0; i--) {
int current = CharToInt(str[i]) + carry; // 计算当前位的结果
result = char(current % 10 + '0') + result; // 将当前位的结果插入到结果的前面
carry = current / 10; // 更新进位
}
while (carry != 0) {
result = char(carry % 10 + '0') + result; // 处理剩余的进位
carry /= 10;
}
return result;
}
int main() {
string s;
while (cin >> s) {
string res = "0"; // 初始化结果为0
for (int i = 2; i < s.size(); i++) {
res = multiple(res, 16); // 乘以16,相当于左移4位
res = Add(res, CharToInt(s[i])); // 加上当前字符代表的值
}
cout << res << endl; // 输出最终结果
}
return 0;
}
提交结果:
编辑切换为居中
添加图片注释,不超过 140 字(可选)