转换步骤 1. 检测输入的原进制数字符串合法性(12.34.45、 234a4.7x*f、(23.489)8 ) 2. 是否为负数,给出标记 3. 原进制数字符串转换为十进制正数值 4. 先分离十进制数值的整数和小数部分d和c 5. 十进制整数d,按求解方法得到序列a0 , a1 , … , an-1 , an,并换算为目标进制数对应的数码字符,得到整数部分的目标进制数字符串ord 6. 十进制小数0.c,按求解方法得到序列a-1 , a-2 , … , a-m,并换算为目标进制数对应的数码字符,得到小数部分的目标进制数字符串orc 7. 串ord+“.”+orc,若为负数,之前还的加上”-”,即得到所求目标进制字符串,c++代码实现以上步骤
时间: 2024-03-26 11:40:01 浏览: 75
以下是一个 C++ 实现转换步骤的示例代码:
```c++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
// 检查字符串是否为合法的原进制数
bool check_validity(string input, int base) {
string valid_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
for (int i = 0; i < input.length(); i++) {
if (input[i] == '.') continue; // 小数点可以忽略
if (valid_chars.find(input[i]) == string::npos || input[i] >= '0' + base) {
return false;
}
}
return true;
}
// 将字符转换为对应的数值
int char_to_int(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'A' && c <= 'Z') {
return c - 'A' + 10;
} else if (c >= 'a' && c <= 'z') {
return c - 'a' + 36;
} else if (c == '+') {
return 62;
} else if (c == '/') {
return 63;
} else {
return -1;
}
}
// 将整数部分转换为目标进制数字符串
string int_to_string(int n, int base) {
string result = "";
while (n > 0) {
int digit = n % base;
if (digit < 10) {
result = char('0' + digit) + result;
} else if (digit < 36) {
result = char('A' + digit - 10) + result;
} else if (digit < 62) {
result = char('a' + digit - 36) + result;
} else if (digit == 62) {
result = '+' + result;
} else if (digit == 63) {
result = '/' + result;
}
n /= base;
}
if (result == "") return "0";
return result;
}
// 将小数部分转换为目标进制数字符串
string frac_to_string(double frac, int base) {
string result = "";
for (int i = 0; i < 10; i++) {
frac *= base;
int digit = int(frac);
frac -= digit;
if (digit < 10) {
result += char('0' + digit);
} else if (digit < 36) {
result += char('A' + digit - 10);
} else if (digit < 62) {
result += char('a' + digit - 36);
} else if (digit == 62) {
result += '+';
} else if (digit == 63) {
result += '/';
}
}
return result;
}
// 进制转换函数
string convert_base(string input, int from_base, int to_base) {
bool is_negative = false;
if (input[0] == '-') {
is_negative = true;
input = input.substr(1);
}
if (!check_validity(input, from_base)) {
return "Invalid input string";
}
double decimal = 0.0;
int dot_pos = input.find('.');
if (dot_pos == string::npos) {
for (int i = 0; i < input.length(); i++) {
decimal = decimal * from_base + char_to_int(input[i]);
}
} else {
for (int i = 0; i < dot_pos; i++) {
decimal = decimal * from_base + char_to_int(input[i]);
}
double frac = 0.0;
for (int i = dot_pos + 1; i < input.length(); i++) {
frac += double(char_to_int(input[i])) / pow(from_base, i - dot_pos);
}
decimal += frac;
}
int int_part = int(decimal);
double frac_part = decimal - int_part;
string int_str = int_to_string(int_part, to_base);
string frac_str = frac_to_string(frac_part, to_base);
if (is_negative) {
return "-" + int_str + "." + frac_str;
} else {
return int_str + "." + frac_str;
}
}
int main() {
string input = "101.101";
int from_base = 2;
int to_base = 16;
string output = convert_base(input, from_base, to_base);
cout << output << endl; // 输出 5.B
return 0;
}
```
这个示例代码实现了将任意进制数转换为任意进制数的功能。其中,check_validity 函数用于检查输入字符串的合法性;char_to_int 函数用于将字符转换为对应的数值;int_to_string 函数用于将整数部分转换为目标进制数字符串;frac_to_string 函数用于将小数部分转换为目标进制数字符串;convert_base 函数是主要的转换函数,它将输入字符串转换为十进制数,再根据目标进制数转换为对应的字符串。
阅读全文