5.7 BASE CONVERSION
来源:互联网 发布:华为网络机顶盒插上u盘 编辑:程序博客网 时间:2024/05/16 07:24
#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;}