题解 | #进制转换#
进制转换
https://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6
解题思路
- 读取十六进制字符串输入(以0x开头)
- 去掉前缀"0x"后进行进制转换
- 可以使用以下方法:
- 使用语言内置的进制转换函数
- 或手动实现:从右往左遍历字符串,每位乘以16的对应次方并累加
- 输出十进制结果
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string hex;
cin >> hex;
// 去掉"0x"前缀
hex = hex.substr(2);
// 将十六进制转换为十进制
int decimal = 0;
for(char c : hex) {
decimal *= 16;
if(c >= '0' && c <= '9') {
decimal += c - '0';
} else {
decimal += (toupper(c) - 'A' + 10);
}
}
cout << decimal << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String hex = sc.nextLine();
// 方法1:使用Integer内置方法
System.out.println(Integer.parseInt(hex.substring(2), 16));
/* 方法2:手动实现
hex = hex.substring(2); // 去掉0x
int decimal = 0;
for(char c : hex.toCharArray()) {
decimal = decimal * 16 +
(Character.isDigit(c) ? c - '0' : Character.toUpperCase(c) - 'A' + 10);
}
System.out.println(decimal);
*/
}
}
# 读取输入,去掉0x前缀
hex_str = input().strip()[2:]
# 方法1:使用int内置函数
print(int(hex_str, 16))
'''
# 方法2:手动实现
decimal = 0
for c in hex_str:
decimal *= 16
if c.isdigit():
decimal += int(c)
else:
decimal += ord(c.upper()) - ord('A') + 10
print(decimal)
'''
算法及复杂度
- 算法:进制转换,按位计算或使用语言内置函数
- 时间复杂度:
- 其中n为十六进制字符串的长度
- 空间复杂度:
- 只需要常数级额外空间