酷代码 AI
菜单
服务商

C++ 八进制字符串转二进制(查表法实现)

好的,这个问题要求编写一个C++程序,将输入的八进制数转换为二进制数并输出。下面我会提供一个**完整、清晰、带有解释**的解决方案。 ## 🛠 准备工作 - 编译器:支持 C++11 或更高版本(如 g++、clang++、MSVC) - 无需安装额外库,使用标准输入输出即可。 ## 💡 核心思路 八进制与二进制之间有一个非常直接的转换关系: - **每一位八进制数**可以直接对应 **3 位二进制数**。 - 例如: - 八进制 `7` → 二进制 `111` - 八进制 `0` → 二进制 `000` - 八进制 `5` → 二进制 `101` 我们有两种常见实现方式: 1. **查表法**:预先定义好 0~7 对应的 3 位二进制字符串,然后逐位替换。 2. **数学计算法**:先将八进制字符串转换为十进制整数,再输出为二进制。 **推荐使用查表法**,因为它更直观、无需处理大数溢出问题(如果八进制数很大,用整数可能溢出),且代码简洁。 ## 📝 代码实现 (查表法) ```cpp #include <iostream> #include <string> int main() { std::string octal; std::cin >> octal; // 输入八进制数(作为字符串) // 八进制数字对应的3位二进制映射表 std::string bin_map[] = { "000", // 0 "001", // 1 "010", // 2 "011", // 3 "100", // 4 "101", // 5 "110", // 6 "111" // 7 }; std::string binary = ""; // 逐位转换 for (char ch : octal) { // 确保字符在 '0'~'7' 范围内 if (ch >= '0' && ch <= '7') { binary += bin_map[ch - '0']; } else { std::cerr << "输入包含非法字符: " << ch << std::endl; return 1; // 错误退出 } } // 去除前导零(但如果没有非零位,则保留一个 '0') size_t first_one = binary.find_first_not_of('0'); if (first_one == std::string::npos) { // 全部是零的情况 std::cout << "0" << std::endl; } else { std::cout << binary.substr(first_one) << std::endl; } return 0; } ``` ## 🔍 代码详解 | 部分 | 说明 | |------|------| | `std::cin >> octal` | 读取一行八进制字符串(如 `173`) | | `bin_map[8]` | 映射表,索引0~7分别对应二进制串 | | `for (char ch : octal)` | 遍历每一个八进制字符 | | `ch - '0'` | 将字符 `'5'` 转为数字 5,作为映射表索引 | | `binary += bin_map[...]` | 拼接对应的3位二进制 | | `find_first_not_of('0')` | 去除前导零,保证输出标准格式(如 `1101` 而非 `0001101`) | | 特殊情况处理 | 如果输入全是 `0`,输出单个 `0` | ## 🧪 示例运行 **输入:** ``` 173 ``` **转换过程:** - `1` → `001` - `7` → `111` - `3` → `011` - 拼接 → `001111011` - 去除前导零 → `1111011` **输出:** ``` 1111011 ``` ## ⚠️ 进阶建议与常见陷阱 1. **输入长度问题**:八进制数可能非常长(例如100位),使用 `std::string` 处理可以避免整数溢出。如果使用 `int` 或 `long long` 转换,很可能溢出。 2. **前导零处理**:上述代码已自动去除前导零。若要求必须保留前导零(例如输出固定长度),可省略 `substr` 步骤。 3. **非法字符检查**:代码中加入了简单的范围检查,增强健壮性。 4. **性能优化**:如果输入非常大,`binary +=` 可能反复分配内存,可以用 `std::ostringstream` 优化,但对于一般题目无需此操作。 ## 📚 替代方案(数学计算法) 如果你更倾向于先将八进制转为十进制,再转为二进制,代码如下(**注意:此方法对于超大数可能溢出**): ```cpp #include <iostream> #include <string> #include <bitset> using namespace std; int main() { string oct_str; cin >> oct_str; int decimal = stoi(oct_str, nullptr, 8); // 将八进制字符串转为十进制整数 cout << bitset<32>(decimal).to_string() << endl; // 输出固定32位二进制(前导零保留) return 0; } ``` **缺点**:受限于 `int` 范围,对于 `37777777777` 等大数会出错。因此**查表法更适合通用场景**。 --- ######[AI写代码神器 | 1208点数解答 | 2026-05-30 14:37:47]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]