forked from adnanaziz/EPIJudge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
convert_base.cc
36 lines (30 loc) · 1.25 KB
/
convert_base.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <numeric>
#include <string>
#include "test_framework/generic_test.h"
using std::accumulate;
using std::string;
string ConstructFromBase(int, int);
string ConvertBase(const string& num_as_string, int b1, int b2) {
bool is_negative = num_as_string.front() == '-';
int num_as_int =
accumulate(begin(num_as_string) + is_negative, end(num_as_string), 0,
[b1](int x, char c) {
return x * b1 + (isdigit(c) ? c - '0' : c - 'A' + 10);
});
return (is_negative ? "-" : "") +
(num_as_int == 0 ? "0" : ConstructFromBase(num_as_int, b2));
}
string ConstructFromBase(int num_as_int, int base) {
return num_as_int == 0
? ""
: ConstructFromBase(num_as_int / base, base) +
static_cast<char>(num_as_int % base >= 10
? 'A' + num_as_int % base - 10
: '0' + num_as_int % base);
}
int main(int argc, char* argv[]) {
std::vector<std::string> args{argv + 1, argv + argc};
std::vector<std::string> param_names{"num_as_string", "b1", "b2"};
return GenericTestMain(args, "convert_base.cc", "convert_base.tsv",
&ConvertBase, DefaultComparator{}, param_names);
}