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;}

原创粉丝点击