C++ 十六进制转八进制 - 揭秘古老宝箱的密码

当你观察到一个神秘的古老宝箱时,你决定尝试打开它。但是,宝箱上面的密码是用十六进制编码的!幸运的是,你是一名优秀的程序员。以下是你需要解决的问题:宝箱上有一行神秘的十六进制数字,但无法直接读取它。你需要编写一个程序,将这个十六进制数字转换为八进制数字,以找到正确的密码。

输入描述

一个十六进制数,以字符串形式给出。该字符串只包含数、点(.)和字母(A-F),字母只包含大写。

输出描述

输出一行,表示对应的八进制数,以字符串形式给出。

样例

样例1

输入
1A
输出
32

样例2

输入
8.1
输出
10.04

样例3

输入
1.A
输出
1.5

样例4

输入
1A.0
输出
32.0

提示

  • 输入的十六进制数对应的十进制数在0~~2147483647之间,可能会有小数
  • 输入中有小数部分,保证输出一定有小数部分内容
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int hexToDec(char c) {
    if (c >= '0' && c <= '9') {
        return c - '0';
    } else {
        return c - 'A' + 10;
    }
}

string decToOct(int dec) {
    string oct = '';
    while (dec > 0) {
        oct = to_string(dec % 8) + oct;
        dec /= 8;
    }
    return oct;
}

string hexToOct(string hex) {
    int decimal = 0;
    bool hasFraction = false;
    string oct = '';
    int fractionLength = 0;

    for (int i = 0; i < hex.length(); i++) {
        char c = hex[i];
        if (c == '.') {
            hasFraction = true;
            fractionLength = hex.length() - i - 1;
        } else {
            decimal = decimal * 16 + hexToDec(c);
        }
    }

    oct = decToOct(decimal);
    if (hasFraction) {
        oct += '.';
        for (int i = 0; i < fractionLength; i++) {
            decimal = (decimal % 8) * 16;
            oct += to_string(decimal / 8);
        }
    }

    return oct;
}

int main() {
    string hex;
    cin >> hex;

    string oct = hexToOct(hex);
    cout << oct << endl;

    return 0;
}

代码解析:

  1. hexToDec(char c) 函数

    • 接受一个十六进制字符,并将其转换为对应的十进制数字。
    • 如果字符是数字,则直接减去 '0' 即可。
    • 如果字符是字母,则减去 'A' 并加上 10。
  2. decToOct(int dec) 函数

    • 接受一个十进制数字,并将其转换为对应的八进制字符串。
    • 使用循环,不断对 dec 求模 8 并将结果加入 oct 字符串的开头。
    • 每次循环后将 dec 除以 8。
  3. hexToOct(string hex) 函数

    • 接受一个十六进制字符串,并将其转换为对应的八进制字符串。
    • 使用 decimal 变量存储十进制整数部分。
    • 使用 hasFractionfractionLength 变量处理小数部分。
    • 循环遍历十六进制字符串:
      • 如果遇到 '.',则表示有小数部分,设置 hasFractiontrue,并计算小数部分的长度。
      • 否则,将字符转换为十进制数字,并累加到 decimal 中。
    • 将整数部分转换为八进制字符串,并存储在 oct 中。
    • 如果有小数部分:
      • oct 中添加 '.'
      • 循环 fractionLength 次,每次将 decimal 模 8 乘以 16,并将结果除以 8 转换为八进制数字,并添加到 oct 中。
  4. main 函数

    • 从标准输入读取十六进制字符串。
    • 调用 hexToOct 函数进行转换。
    • 将转换后的八进制字符串输出到标准输出。

使用示例:

  1. 编译代码:g++ hex_to_oct.cpp -o hex_to_oct
  2. 运行程序:./hex_to_oct
  3. 输入十六进制数字,例如 1A,按下回车键,程序会输出 32

通过这道题,你学习了如何使用C++进行进制转换,并理解了十六进制、八进制和十进制之间的关系。你可以将这套代码用于其他需要进行进制转换的场景,例如解密古老的密码或进行数据分析。

注意:

  • 以上代码中,十六进制字符串中使用的字母都是大写字母。
  • 代码中使用了 cmath 库中的 to_string 函数,用于将数字转换为字符串。
  • 代码只支持输入整数和小数点,不支持其他字符。

希望这篇文章对你有所帮助!

如果你有任何问题或建议,请随时提出。

C++ 十六进制转八进制 - 揭秘古老宝箱的密码

原文地址: https://www.cveoy.top/t/topic/nwY8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录