#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;
string convert_base(const string& s, const int b1, const int b2) {
bool neg = (s[0] == '-');
int x = 0;
for (int i = neg; i < s.size(); i++) {
x *= b1;
x += isdigit(s[i]) ? s[i] - '0' : s[i] - 'A' + 10;
}
string ret;
while (x) {
int r = x % b2;
ret.push_back(r < 10 ? r + '0' : r - 10 + 'A');
x /= b2;
}
if (ret.empty()) {
return "0";
}
if (neg) {
ret.push_back('-');
}
reverse(ret.begin(), ret.end());
return ret;
}
string rand_int_string(int len) {
string ret;
if (len == 0) {
return "0";
}
if (rand() & 1) {
ret.push_back('-');
}
ret.push_back('1' + rand() % 9);
while (len--) {
ret.push_back('0' + rand() % 10);
}
return ret;
}
int main(int argc, char *argv[]) {
srand(time(nullptr));
if (argc == 4) {
string input(argv[1]);
cout << convert_base(input, atoi(argv[2]), atoi(argv[3])) << endl;
assert(input == convert_base(convert_base(input, atoi(argv[2]), atoi(argv[3])), atoi(argv[3]), atoi(argv[2])));
} else {
for (int i = 0; i < 10; i++) {
string input = rand_int_string(rand() % 10);
int base = 2 + rand() % 15;
cout << "input is " << input << ", base1 = 10, base2 = " << base << ", ans = " << convert_base(input, 10, base) << endl;
assert(input == convert_base(convert_base(input, 10, base), base, 10));
}
}
return 0;
}
5.7 BASE CONVERSION
最新推荐文章于 2021-09-22 21:58:16 发布