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