[C++] 纯文本查看 复制代码 #include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
// 字符转数字(如 'A' -> 10, '3' -> 3)
int charToValue(char c) {
if (isdigit(c)) {
return c - '0';
} else if (isalpha(c)) {
return toupper(c) - 'A' + 10; // 不区分大小写
}
return -1; // 无效字符
}
// 数字转字符(如 10 -> 'A', 3 -> '3')
char valueToChar(int value) {
if (value >= 0 && value <= 9) {
return '0' + value;
} else if (value >= 10) {
return 'A' + (value - 10);
}
return '?'; // 无效值
}
/**
* 通用进制转换函数
* @param number 输入数字的字符串表示
* @param fromBase 输入数字的进制(2-36)
* @param toBase 目标进制(2-36)
* @return 转换后的字符串表示
*/
string convertBase(const string& number, int fromBase, int toBase) {
// 检查进制合法性
if (fromBase < 2 || fromBase > 36 || toBase < 2 || toBase > 36) {
return "错误:进制必须在2-36之间";
}
// 步骤1:先将输入转换为十进制数
long long decimal = 0; // 使用long long处理较大数值
bool isNegative = false;
string num = number;
// 处理负数
if (!num.empty() && num[0] == '-') {
isNegative = true;
num = num.substr(1);
}
// 转换为十进制
for (char c : num) {
int val = charToValue(c);
if (val == -1 || val >= fromBase) {
return "错误:输入包含无效字符";
}
decimal = decimal * fromBase + val;
}
// 特殊情况:输入为0
if (decimal == 0) {
return "0";
}
// 步骤2:将十进制转换为目标进制
string result;
while (decimal > 0) {
int remainder = decimal % toBase;
result += valueToChar(remainder);
decimal /= toBase;
}
// 添加负号
if (isNegative) {
result += '-';
}
// 反转结果(因为我们是从低位开始计算的)
reverse(result.begin(), result.end());
return result;
}
// 十进制转二进制
string decimalToBinary(int decimal) {
return convertBase(to_string(decimal), 10, 2);
}
// 十进制转八进制
string decimalToOctal(int decimal) {
return convertBase(to_string(decimal), 10, 8);
}
// 十进制转十六进制
string decimalToHexadecimal(int decimal) {
return convertBase(to_string(decimal), 10, 16);
}
// 二进制转十进制
int binaryToDecimal(const string& binary) {
// 调用通用转换函数,先转为十进制字符串再转换为整数
return stoi(convertBase(binary, 2, 10));
}
// 八进制转十进制
int octalToDecimal(const string& octal) {
return stoi(convertBase(octal, 8, 10));
}
// 十六进制转十进制
int hexadecimalToDecimal(const string& hex) {
return stoi(convertBase(hex, 16, 10));
}
int main() {
// 示例1:十进制转其他进制
int decimalNum = 255;
cout << "十进制 " << decimalNum << " 转换结果:" << endl;
cout << "二进制: " << decimalToBinary(decimalNum) << endl; // 11111111
cout << "八进制: " << decimalToOctal(decimalNum) << endl; // 377
cout << "十六进制: " << decimalToHexadecimal(decimalNum) << endl; // FF
cout << endl;
// 示例2:其他进制转十进制
string binaryStr = "1010";
string octalStr = "12";
string hexStr = "A";
cout << "二进制 " << binaryStr << " 转十进制: " << binaryToDecimal(binaryStr) << endl; // 10
cout << "八进制 " << octalStr << " 转十进制: " << octalToDecimal(octalStr) << endl; // 10
cout << "十六进制 " << hexStr << " 转十进制: " << hexadecimalToDecimal(hexStr) << endl; // 10
cout << endl;
// 示例3:任意进制转换
string num = "1010"; // 二进制的1010
cout << "二进制 " << num << " 转八进制: " << convertBase(num, 2, 8) << endl; // 12
cout << "二进制 " << num << " 转十六进制: " << convertBase(num, 2, 16) << endl; // A
cout << endl;
// 示例4:处理负数和大写字母
string negativeHex = "-a3";
cout << "十六进制 " << negativeHex << " 转十进制: " << convertBase(negativeHex, 16, 10) << endl; // -163
cout << "十六进制 " << negativeHex << " 转二进制: " << convertBase(negativeHex, 16, 2) << endl; // -10100011
cout << endl;
// 示例5:高进制转换(如10进制转36进制)
int largeNum = 123456;
cout << "十进制 " << largeNum << " 转36进制: " << convertBase(to_string(largeNum), 10, 36) << endl; // 2N9C
return 0;
}
|