题解
【基础】二进制转换八进制
1 条题解
-
0
解题思路
题目要求把二进制数转换成八进制数。二进制最长 100 位,数字太大,不能直接算,要用一个巧妙的规律。
核心规律:二进制的每 3 位,正好对应八进制的 1 位。
比如二进制 111 是 7(八进制的一位 7),二进制 100 是 4。
所以只要把二进制从右往左每 3 位分成一组,每组单独转成一个八进制数字,连起来就是答案。
步骤:
- 如果二进制的位数不是 3 的倍数,在左边补 0,让长度变成 3 的倍数
- 从左边开始,每 3 位分成一组
- 每组单独转成八进制数字(0~7)
- 把所有数字连起来输出
为什么每 3 位一组? 因为 8 = 2³,所以 3 位二进制正好表示 0~7,就是 1 位八进制。
举例 二进制 111100001111000011110000(24 位):
- 每 3 位一组:111 100 001 111 000 011 110 000
- 转成八进制:7 4 1 7 0 3 6 0
- 结果 74170360
参考代码
#include <iostream> #include <string> using namespace std; char num(string s) { int r = 0, t = 1; for (int i = s.size() - 1; i >= 0; i--) { r += (s[i] - '0') * t; t *= 2; } return char(r + '0'); } int main() { string s; cin >> s; if (s.size() % 3 == 1) s = "00" + s; else if (s.size() % 3 == 2) s = "0" + s; for (int i = 0; i < s.size(); i += 3) { cout << num(s.substr(i, 3)); } return 0; }复杂度分析
- 时间复杂度:O(N),N 为二进制位数
- 空间复杂度:O(1)
- 1