十进制转任意进制:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 将十进制数转换为P进制形式的字符串
string toBase(int num, int base) {
string result = ""; // 初始化结果字符串为空
while (num > 0) { // 当num大于0时执行循环
int digit = num % base; // 计算num除以base的余数
char digitChar; // 定义字符变量用于表示余数对应的字符
if (digit >= 10) { // 如果余数大于等于10
digitChar = 'A' + digit - 10; // 将余数转换为对应的字母(大写)
}
else { // 否则余数为个位数
digitChar = '0' + digit; // 将余数转换为对应的字符
}
result = digitChar + result; // 将当前字符添加到结果字符串的开头
num /= base; // 更新num为num除以base的商
}
return result; // 返回转换后的P进制字符串
}
int main() {
cout << "请输入需要转换的数字x和进制数P:";
int x;
cin >> x;
int P;
cin >> P;
cout << toBase(x,P);
return 0;
}
几个案例解释:
案例一:
-
用户输入: 用户输入两个值:
x
和P
。在这个例子中,x
为66,P
为4。 -
调用
toBase
函数: 函数toBase
接受两个参数:要转换的十进制数num
(这里是66)和目标进制数base
(这里是4)。 -
循环计算:
- 第一次循环:
- 计算
66 % 4 = 2
,余数为2。对应的字符是'2'
。 66 / 4 = 16
,商为16。更新num
为16。
- 计算
- 第二次循环:
- 计算
16 % 4 = 0
,余数为0。对应的字符是'0'
. 16 / 4 = 4
,商为4。更新num
为4。
- 计算
- 第三次循环:
- 计算
4 % 4 = 0
,余数为0。对应的字符是'0'
。 4 / 4 = 1
,商为1。更新num
为1。
- 计算
- 第四次循环:
- 计算
1 % 4 = 1
,余数为1。对应的字符是'1'
。 1 / 4 = 0
,商为0,循环结束。
- 计算
由于
result
是逆序构建的,结果字符串为'1002'
。 - 第一次循环:
-
输出结果: 将
toBase
的结果输出至标准输出流。 最终结果为'1002'
,即66转为4进制的表示是'1002'
。
案例二:
-
用户输入: 用户输入两个值:
x
和P
。在这个例子中,x
为666,P
为24。 -
调用
toBase
函数: 函数toBase
接受两个参数:要转换的十进制数num
(这里是666)和目标进制数base
(这里是24)。 -
循环计算:
- 第一次循环:
- 计算
666 % 24 = 18
,余数为18。对应的字符是'I'
。 666 / 24 = 27
,商为27。更新num
为27。
- 计算
- 第二次循环:
- 计算
27 % 24 = 3
,余数为3。对应的字符是'3'
。 27 / 24 = 1
,商为1。更新num
为1。
- 计算
- 第三次循环:
- 计算
1 % 24 = 1
,余数为1。对应的字符是'1'
。 1 / 24 = 0
,商为0,循环结束。
- 计算
由于
result
是逆序构建的,结果字符串为'1318'
。 - 第一次循环:
-
输出结果: 将
toBase
的结果输出至标准输出流。 最终结果为'1318'
,即666转为24进制的表示是'1318'
。
案例三:
-
用户输入: 用户输入两个值:
x
和P
。在这个例子中,x
为999,P
为36。 -
调用
toBase
函数: 函数toBase
接受两个参数:要转换的十进制数num
(这里是999)和目标进制数base
(这里是36)。 -
循环计算:
- 第一次循环:
- 计算
999 % 36 = 27
,余数为27。对应的字符是'R'
。 999 / 36 = 27
,商为27。更新num
为27。
- 计算
- 第二次循环:
- 计算
27 % 36 = 27
,余数为27。对应的字符是'R'
。 27 / 36 = 0
,商为0,循环结束。
- 计算
由于
result
是逆序构建的,结果字符串为'RR'
。 - 第一次循环:
-
输出结果: 将
toBase
的结果输出至标准输出流。 最终结果为'RR'
,即999转为36进制的表示是'RR'
。
任意进制之间的转换:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 将十进制数转换为P进制形式的字符串
string toBase(int num, int base) {
string result = ""; // 初始化结果字符串为空
while (num > 0) { // 当num大于0时执行循环
int digit = num % base; // 计算num除以base的余数
char digitChar; // 定义字符变量用于表示余数对应的字符
if (digit >= 10) { // 如果余数大于等于10
digitChar = 'A' + digit - 10; // 将余数转换为对应的字母(大写)
}
else { // 否则余数为个位数
digitChar = '0' + digit; // 将余数转换为对应的字符
}
result = digitChar + result; // 将当前字符添加到结果字符串的开头
num /= base; // 更新num为num除以base的商
}
return result; // 返回转换后的P进制字符串
}
// 将P进制数(以字符串形式给出)转换为十进制数
int fromBase(const string& num, int base) {
int result = 0;
int power = 1;
for (int i = num.size() - 1; i >= 0; --i) {
char digitChar = num[i];
int digit = 0;
if (digitChar >= '0' && digitChar <= '9') {
digit = digitChar - '0';
} else if (digitChar >= 'A' && digitChar <= 'Z') {
digit = digitChar - 'A' + 10;
} else if (digitChar >= 'a' && digitChar <= 'z') {
digit = digitChar - 'a' + 10;
} else {
cerr << "Invalid character in input string!" << endl;
return -1; // 返回-1表示输入字符串中有无效字符
}
result += digit * power;
power *= base;
}
return result;
}
int main() { //仅仅在调用第二个函数
cout << "请输入需要转换的数字x(以字符串形式给出)和进制数P:";
string x;
cin >> x;
int P;
cin >> P;
// 检查进制数是否合法(应在2到36之间)
if (P < 2 || P > 36) {
cerr << "Invalid base! Base should be between 2 and 36." << endl;
return 1;
}
int decimalValue = fromBase(x, P);
if (decimalValue != -1) {
cout << "转换后的十进制数为: " << decimalValue << endl;
}
return 0;
}