题解
【基础】十六进制转二进制
1 条题解
-
0
解题思路
题目要求把十六进制数转换成二进制数。十六进制最长 100 位,不能先转成十进制(太大,long long 都装不下),要利用规律。
核心规律:十六进制的 1 位,正好对应二进制的 4 位。
因为 16 = 2⁴,所以每个十六进制数字都能直接查表转成 4 位二进制。
步骤:
- 准备一个表,存 0~15 对应的 4 位二进制
- 把十六进制数的每一位转成 4 位二进制,依次拼起来
- 去掉前导 0(如果全是 0 就输出一个 0)
举例 十六进制 A:A 是 10,对应的 4 位二进制是 1010。所以十六进制 A 转成二进制就是 1010。
为什么不用先转十进制? 因为十六进制太长时十进制会超过 long long 的范围,溢出出错。直接一位转 4 位最安全。
参考代码
#include <iostream> #include <string> using namespace std; int main() { string t[16] = {"0000","0001","0010","0011","0100","0101","0110","0111", "1000","1001","1010","1011","1100","1101","1110","1111"}; string s, r; cin >> s; for (int i = 0; i < s.size(); i++) { int x; if (s[i] >= '0' && s[i] <= '9') x = s[i] - '0'; else x = s[i] - 'A' + 10; r += t[x]; // 每位十六进制转 4 位二进制 } // 去前导 0 int p = 0; while (p < r.size() && r[p] == '0') p++; if (p == r.size()) cout << 0; else cout << r.substr(p); return 0; }复杂度分析
- 时间复杂度:O(N),N 为十六进制位数
- 空间复杂度:O(N),存二进制字符串
- 1