进制转换技术详解
进制转换基础
X 进制转十进制
使用位值累加法:
- 写出所有位的位号。
- 基数的位号次方得到位权。
- 十进制数字 = 位权 × 该位上的数字之和。
int convertToDecimal(string input, int base) {
int result = 0;
int length = input.size();
for (int i = 0; i < length; ++i) {
if (input[i] >= '0' && input[i] <= '9') {
result = result * base + (input[i] - '0');
} else if (input[i] >= 'A' && input[i] <= 'F') {
result = result * base + (input[i] - 'A' + 10);
}
}
return result;
}
十进制转X进制
- 每次除以基数,记录余数作为当前最低位的数值。
- 继续用商除以基数。
- 最后将所有余数反转即为结果。
string convertFromDecimal(int num, int base) {
string result = "";
while (num > 0) {
int remainder = num % base;
if (remainder < 10) {
result = char('0' + remainder) + result;
} else {
result = char('A' + remainder - 10) + result;
}
num /= base;
}
return result.empty() ? "0" : result;
}
问题示例
B3620 X进制转10进制
#include <iostream>
#include <string>
using namespace std;
int convertToDecimal(string input, int base) {
int result = 0;
int length = input.size();
for (int i = 0; i < length; ++i) {
if (input[i] >= '0' && input[i] <= '9') {
result = result * base + (input[i] - '0');
} else if (input[i] >= 'A' && input[i] <= 'F') {
result = result * base + (input[i] - 'A' + 10);
}
}
return result;
}
int main() {
int base;
string value;
cin >> base >> value;
cout << convertToDecimal(value, base);
return 0;
}
B3619 10进制转X进制
#include <iostream>
#include <string>
using namespace std;
string convertFromDecimal(int num, int base) {
string result = "";
while (num > 0) {
int remainder = num % base;
if (remainder < 10) {
result = char('0' + remainder) + result;
} else {
result = char('A' + remainder - 10) + result;
}
num /= base;
}
return result.empty() ? "0" : result;
}
int main() {
int number, base;
cin >> number >> base;
cout << convertFromDecimal(number, base);
return 0;
}
P2084 进制转换
#include <iostream>
#include <string>
using namespace std;
int main() {
int radix;
string value;
cin >> radix >> value;
int len = value.size();
for (int i = 0; i < len; ++i) {
if (value[i] != '0') {
if (i > 0) cout << "+";
cout << value[i] << "*" << radix << "^" << len - i - 1;
}
}
return 0;
}
P8723 蓝桥杯乘法表
#include <iostream>
#include <string>
using namespace std;
string convertFromDecimal(int num, int base) {
string result = "";
while (num > 0) {
int remainder = num % base;
if (remainder < 10) {
result = char('0' + remainder) + result;
} else {
result = char('A' + remainder - 10) + result;
}
num /= base;
}
return result.empty() ? "0" : result;
}
int main() {
int base;
cin >> base;
for (int i = 1; i < base; ++i) {
for (int j = 1; j <= i; ++j) {
cout << convertFromDecimal(i, base) << "*" << convertFromDecimal(j, base) << "=" << convertFromDecimal(i * j, base) << " ";
}
cout << endl;
}
return 0;
}
B2141 确定进制
#include <iostream>
#include <string>
using namespace std;
long long convertToDecimal(string input, long long base) {
long long result = 0;
long long length = input.size();
for (long long i = 0; i < length; ++i) {
if (input[i] >= '0' && input[i] <= '9') {
result = result * base + (input[i] - '0');
} else if (input[i] >= 'A' && input[i] <= 'Z') {
result = result * base + (input[i] - 'A' + 10);
}
}
return result;
}
bool check(long long num, long long base) {
long long maxDigit = 0;
while (num > 0) {
if (num % 10 > maxDigit) maxDigit = num % 10;
num /= 10;
}
return maxDigit < base;
}
int main() {
long long p, q, r;
cin >> p >> q >> r;
for (long long i = 2; i <= 16; ++i) {
if (!check(p, i) || !check(q, i) || !check(r, i)) continue;
long long num1 = convertToDecimal(to_string(p), i);
long long num2 = convertToDecimal(to_string(q), i);
long long num3 = convertToDecimal(to_string(r), i);
if (num1 * num2 == num3) {
cout << i << endl;
return 0;
}
}
cout << 0;
return 0;
}