#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int num(char c) // цифра в некоторой системе счисления
{
const char digs[] = "0123456789abcdefghijklmnopqrstuvwxyz";
return int(strchr(digs, tolower(c)) - digs);
}
// Строка с числом в системе счисления base в double
// Защиты от дурака нет!
double toNum(const char* s, int base)
{
if (base < 2 || base > 36) throw range_error("Wrong base");
const char* c;
double r = 0;
for (c = s; *c && *c != '.'; ++c)
r = r * base + num(*c);
if (*c == '.')
{
for (double bs = base; *++c && bs > 0; bs *= base)
r += num(*c) / bs;
}
return r;
}
// Число double в строку в системе счисления base, с prec знаков после точки
// Защиты от дурака нет!
string fromNum(double x, int base, int prec = 6)
{
const char digs[] = "0123456789abcdefghijklmnopqrstuvwxyz";
if (base < 2 || base > 36) throw range_error("Wrong base");
int d = floor(x);
string r;
if (d == 0) r = "0";
else
{
while (d)
{
r += digs[d % base];
d /= base;
}
reverse(r.begin(), r.end());
}
x = x - floor(x);
if (x && prec > 0)
{
r += '.';
for (int i = 0; i < prec; ++i)
{
x *= base;
r += digs[int(x)];
x = x - floor(x);
}
}
return r;
}
// Простенький тест...
int main(int argc, char* argv[])
{
string seven = "1234.56";
cout << "orig: " << seven << endl;
double x = toNum(seven.c_str(), 7);
cout << "x = " << x << endl;
string elev = fromNum(x, 11, 20);
cout << "11: " << elev << endl;
x = toNum(elev.c_str(), 11);
cout << "x = " << x << endl;
elev = fromNum(x, 4, 20);
cout << "4: " << elev << endl;
x = toNum(elev.c_str(), 4);
cout << "x = " << x << endl;
elev = fromNum(x, 7, 20);
cout << "7: " << elev << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG51bShjaGFyIGMpICAvLyDRhtC40YTRgNCwINCyINC90LXQutC+0YLQvtGA0L7QuSDRgdC40YHRgtC10LzQtSDRgdGH0LjRgdC70LXQvdC40Y8KewogICAgY29uc3QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKICAgIHJldHVybiBpbnQoc3RyY2hyKGRpZ3MsIHRvbG93ZXIoYykpIC0gZGlncyk7Cn0KCi8vINCh0YLRgNC+0LrQsCDRgSDRh9C40YHQu9C+0Lwg0LIg0YHQuNGB0YLQtdC80LUg0YHRh9C40YHQu9C10L3QuNGPIGJhc2Ug0LIgZG91YmxlCi8vINCX0LDRidC40YLRiyDQvtGCINC00YPRgNCw0LrQsCDQvdC10YIhCmRvdWJsZSB0b051bShjb25zdCBjaGFyKiBzLCBpbnQgYmFzZSkKewogICAgaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikgdGhyb3cgcmFuZ2VfZXJyb3IoIldyb25nIGJhc2UiKTsKICAgIGNvbnN0IGNoYXIqIGM7CiAgICBkb3VibGUgciA9IDA7CiAgICBmb3IgKGMgPSBzOyAqYyAmJiAqYyAhPSAnLic7ICsrYykKICAgICAgICByID0gciAqIGJhc2UgKyBudW0oKmMpOwogICAgaWYgKCpjID09ICcuJykKICAgIHsKICAgICAgICBmb3IgKGRvdWJsZSBicyA9IGJhc2U7ICorK2MgJiYgYnMgPiAwOyBicyAqPSBiYXNlKQogICAgICAgICAgICByICs9IG51bSgqYykgLyBiczsKICAgIH0KICAgIHJldHVybiByOwp9CgovLyDQp9C40YHQu9C+IGRvdWJsZSDQsiDRgdGC0YDQvtC60YMg0LIg0YHQuNGB0YLQtdC80LUg0YHRh9C40YHQu9C10L3QuNGPIGJhc2UsINGBIHByZWMg0LfQvdCw0LrQvtCyINC/0L7RgdC70LUg0YLQvtGH0LrQuAovLyDQl9Cw0YnQuNGC0Ysg0L7RgiDQtNGD0YDQsNC60LAg0L3QtdGCIQpzdHJpbmcgZnJvbU51bShkb3VibGUgeCwgaW50IGJhc2UsIGludCBwcmVjID0gNikKewogICAgY29uc3QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKICAgIGlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpIHRocm93IHJhbmdlX2Vycm9yKCJXcm9uZyBiYXNlIik7CiAgICBpbnQgZCA9IGZsb29yKHgpOwogICAgc3RyaW5nIHI7CiAgICBpZiAoZCA9PSAwKSByID0gIjAiOwogICAgZWxzZQogICAgewogICAgICAgIHdoaWxlIChkKQogICAgICAgIHsKICAgICAgICAgICAgciArPSBkaWdzW2QgJSBiYXNlXTsKICAgICAgICAgICAgZCAvPSBiYXNlOwogICAgICAgIH0KICAgICAgICByZXZlcnNlKHIuYmVnaW4oKSwgci5lbmQoKSk7CiAgICB9CiAgICB4ID0geCAtIGZsb29yKHgpOwogICAgaWYgKHggJiYgcHJlYyA+IDApCiAgICB7CiAgICAgICAgciArPSAnLic7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVjOyArK2kpCiAgICAgICAgewogICAgICAgICAgICB4ICo9IGJhc2U7CiAgICAgICAgICAgIHIgKz0gZGlnc1tpbnQoeCldOwogICAgICAgICAgICB4ID0geCAtIGZsb29yKHgpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByOwp9CgoKLy8g0J/RgNC+0YHRgtC10L3RjNC60LjQuSDRgtC10YHRgi4uLiAgIAppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7CiAgICBzdHJpbmcgc2V2ZW4gPSAiMTIzNC41NiI7CiAgICBjb3V0IDw8ICJvcmlnOiAiIDw8IHNldmVuIDw8IGVuZGw7CiAgICBkb3VibGUgeCA9IHRvTnVtKHNldmVuLmNfc3RyKCksIDcpOwogICAgY291dCA8PCAieCA9ICIgPDwgeCA8PCBlbmRsOwogICAgc3RyaW5nIGVsZXYgPSBmcm9tTnVtKHgsIDExLCAyMCk7CiAgICBjb3V0IDw8ICIxMTogIiA8PCBlbGV2IDw8IGVuZGw7CgoKICAgIHggPSB0b051bShlbGV2LmNfc3RyKCksIDExKTsKICAgIGNvdXQgPDwgInggPSAiIDw8IHggPDwgZW5kbDsKICAgIGVsZXYgPSBmcm9tTnVtKHgsIDQsIDIwKTsKICAgIGNvdXQgPDwgIjQ6ICIgPDwgZWxldiA8PCBlbmRsOwoKCiAgICB4ID0gdG9OdW0oZWxldi5jX3N0cigpLCA0KTsKICAgIGNvdXQgPDwgInggPSAiIDw8IHggPDwgZW5kbDsKICAgIGVsZXYgPSBmcm9tTnVtKHgsIDcsIDIwKTsKICAgIGNvdXQgPDwgIjc6ICIgPDwgZWxldiA8PCBlbmRsOwp9Cg==