#include #include #define F(i, n) for (i = 0; i < n; i++) #define Fcon(i, n, con) for (i = 0; i < n && (con); i++) #define Clear(m) memset(m, 0, sizeof(m)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define brkon(con1, con2) if ((con1) && (con2)) break char num[1000]; int lastpos; /*int logb(long num, int b) { printf("%f\n", log(num) / log(b)); return (int) ((log(num) / log(b))*100) / 100; }*/ long rec(long n, int pos, int b, long lastk) { /*printf("n = %ld\n", n);*/ if (!n) { lastpos = pos; return lastk; } long sum = 0; long k = 1; int bn; int neg = 0; int p; if (n < 0) { n = -n; k = b; neg = 1; } while (sum < n) { bn = 0; while (sum + bn * k < n) { bn++; if (bn >= b) { bn--; break; } } sum += (bn) * k; /*printf("sum = %ld\n", sum);*/ k *= b*b; } k /= b*b; /*printf("k1 = %d\n", k);*/ if (lastk == 0) num[p = 0] = bn + '0'; else { p = pos; while (lastk / b > k) { num[++p] = '0'; lastk /= b; } /*printf("p = %d\n", p);*/ num[++p] = bn + '0'; } /*printf("k = %d\n", k);*/ return rec((neg ? -n : n) - bn * (neg ? -k : k), p, b, k); } void decode(long n, int b) { if (n != 0) { long lastk = rec(n, 0, b, 0); while (lastk / b > 0) { num[++lastpos] = '0'; lastk /= b; } } else num[0] = '0'; } long encode(int b) { int i; long k = 1; long res = 0; for (i = strlen(num) - 1; i >= 0; i--) { res += (num[i] - '0') * k; k *= -b; } return res; } int main() { int b; long n; char c; int end = 0; while (!end) { scanf("%c", &c); Clear(num); switch (c) { case 't': scanf("%*c"); scanf("%d %ld", &b, &n); decode(n, -b); printf("%s\n", num); break; case 'f': scanf("%*c%*c%*c"); scanf("%d%s", &b, num); printf("%ld\n", encode(-b)); break; case 'e': end = 1; break; } } return 0; }