C++ 十六进制转八进制 - 揭秘古老宝箱的密码
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;
}
代码解析:
-
hexToDec(char c)函数- 接受一个十六进制字符,并将其转换为对应的十进制数字。
- 如果字符是数字,则直接减去 '0' 即可。
- 如果字符是字母,则减去 'A' 并加上 10。
-
decToOct(int dec)函数- 接受一个十进制数字,并将其转换为对应的八进制字符串。
- 使用循环,不断对
dec求模 8 并将结果加入oct字符串的开头。 - 每次循环后将
dec除以 8。
-
hexToOct(string hex)函数- 接受一个十六进制字符串,并将其转换为对应的八进制字符串。
- 使用
decimal变量存储十进制整数部分。 - 使用
hasFraction和fractionLength变量处理小数部分。 - 循环遍历十六进制字符串:
- 如果遇到
'.',则表示有小数部分,设置hasFraction为true,并计算小数部分的长度。 - 否则,将字符转换为十进制数字,并累加到
decimal中。
- 如果遇到
- 将整数部分转换为八进制字符串,并存储在
oct中。 - 如果有小数部分:
- 在
oct中添加'.'。 - 循环
fractionLength次,每次将decimal模 8 乘以 16,并将结果除以 8 转换为八进制数字,并添加到oct中。
- 在
-
main函数- 从标准输入读取十六进制字符串。
- 调用
hexToOct函数进行转换。 - 将转换后的八进制字符串输出到标准输出。
使用示例:
- 编译代码:
g++ hex_to_oct.cpp -o hex_to_oct - 运行程序:
./hex_to_oct - 输入十六进制数字,例如
1A,按下回车键,程序会输出32。
通过这道题,你学习了如何使用C++进行进制转换,并理解了十六进制、八进制和十进制之间的关系。你可以将这套代码用于其他需要进行进制转换的场景,例如解密古老的密码或进行数据分析。
注意:
- 以上代码中,十六进制字符串中使用的字母都是大写字母。
- 代码中使用了
cmath库中的to_string函数,用于将数字转换为字符串。 - 代码只支持输入整数和小数点,不支持其他字符。
希望这篇文章对你有所帮助!
如果你有任何问题或建议,请随时提出。
原文地址: https://www.cveoy.top/t/topic/nwY8 著作权归作者所有。请勿转载和采集!