一、问题背景二、完整代码实现- #include <iostream>
- #include <string>
- #include <algorithm>
- using namespACe std;
- // 验证八进制字符串合法性
- bool isValidOctal(const string& s) {
- if(s.empty() || s.length() > 1000) return false;
- for(char c : s) {
- if(c < '0' || c > '7') return false;
- }
- return true;
- }
- // 八进制转十进制(大数处理)
- string octalToDecimal(const string& octal) {
- string decimal = "0";
- for(char c : octal) {
- int digit = c - '0';
- // 十进制数乘以8
- string temp = decimal;
- int carry = 0;
- for(int i = temp.length()-1; i >= 0; i--) {
- int num = (temp[i] - '0') * 8 + carry;
- temp[i] = (num % 10) + '0';
- carry = num / 10;
- }
- if(carry > 0) {
- temp.insert(0, 1, carry + '0');
- }
- // 加上当前位
- carry = digit;
- for(int i = temp.length()-1; i >= 0 && carry > 0; i--) {
- int num = (temp[i] - '0') + carry;
- temp[i] = (num % 10) + '0';
- carry = num / 10;
- }
- if(carry > 0) {
- temp.insert(0, 1, carry + '0');
- }
- decimal = temp;
- }
- return decimal;
- }
- // 十进制转十六进制(大数处理)
- string decimalToHex(const string& decimal) {
- if(decimal == "0") return "0";
-
- string hex;
- string num = decimal;
- const string hexDigits = "0123456789abcdef";
-
- while(num != "0") {
- int remainder = 0;
- string temp;
- // 模拟除法过程
- for(char c : num) {
- int digit = remainder * 10 + (c - '0');
- remainder = digit % 16;
- digit /= 16;
- if(!temp.empty() || digit > 0) {
- temp.push_back(digit + '0');
- }
- }
- hex.push_back(hexDigits[remainder]);
- num = temp.empty() ? "0" : temp;
- }
-
- reverse(hex.begin(), hex.end());
- return hex;
- }
- int main() {
- string octal;
- cin >> octal;
-
- if(!isValidOctal(octal)) {
- cout << "Invalid input: must be octal string (0-7) with length ≤1000" << endl;
- return 1;
- }
-
- string decimal = octalToDecimal(octal);
- string hex = decimalToHex(decimal);
-
- cout << hex << endl;
- return 0;
- }
复制代码
三、代码解析1. 输入验证isValidOctal函数检查输入字符串是否为空、长度是否超过1000,以及是否包含非八进制数字字符(0-7以外的字符)。 2. 八进制转十进制octalToDecimal函数采用逐位处理的方式: 初始化十进制结果为"0" 对每个八进制数字:
当前十进制结果乘以8(模拟大数乘法) 加上当前位的值(模拟大数加法)
使用进位机制处理运算过程中的溢出
3. 十进制转十六进制decimalToHex函数采用除法取余法: 不断将十进制数除以16,记录余数 使用字符串模拟大数除法过程 最后将余数序列反转得到正确顺序
4. 主函数逻辑读取输入 验证输入合法性 先转换为十进制,再转换为十六进制 输出结果
四、学习要点大数处理技巧:使用字符串模拟数字运算 字符串操作:插入、反转等常用字符串方法的应用
五、性能优化建议可以预先分配足够大的字符串空间,减少内存分配次数 考虑使用更高效的 算法,如直接八进制转十六进制(跳过十进制中间步骤) 对于特别大的输入,可以并行处理不同数位
六、常见问题解答Q: 为什么需要先转十进制再转十六进制? A: 这是最直观的实现方式,虽然效率不是最高,但易于理解和实现。 Q: 如何处理前导零? A: 当前代码已经正确处理,不会输出不必要的前导零。 Q: 为什么结果中的字母是小写的? A: 题目通常不区分大小写,如需大写可以简单转换。
|