#include #include #include #define isin(x, a, b) ((x >= a) && (x <= b)) #define znak2cislo(x) (x >= 'A' ? x - 'A' + 10 : x - '0') #define cislo2znak(x) (x >= 10 ? x - 10 + 'A' : x + '0') #define max(x, y) ((x > y) ? (x) : (y)) char* soucet2(char *a, char *b, int zaklad) { static char zpet[2001]; int alen = strlen(a); int blen = strlen(b); // int alen2 = alen, blen2 = blen; // for (int i = 0; i < alen - 1; i++) // { if (a[i] == '0') a = &a[i+1]; alen2--; } // for (int i = 0; i < blen - 1; i++) // { if (b[i] == '0') b = &b[i+1]; blen2--; } // alen = alen2; // blen = blen2; if (zaklad == 1) { int jednicek = 0, j; for (j = 0; j < alen; j++) if (a[j] == '1') jednicek++; for (j = 0; j < blen; j++) if (b[j] == '1') jednicek++; for (j = 0; j < jednicek; j++) { zpet[j] = '1'; } if (jednicek == 0) { zpet[0] = '0'; j = 1; } zpet[j] = 0; return zpet; } int scet = 0; int i; for (i = 0; i < max(alen, blen); i++) { int index1, index2; index1 = alen - i - 1; index2 = blen - i - 1; scet += (index1 < 0 ? 0 : znak2cislo(a[index1])) + (index2 < 0 ? 0 : znak2cislo(b[index2])); char znak; // if ((scet / zaklad)) znak = cislo2znak(scet % zaklad); scet /= zaklad; zpet[i] = znak; } // if (scet % zaklad == 0) i--; char znak = cislo2znak(scet % zaklad); if (znak != '0') zpet[i++] = znak; zpet[i++] = 0; int l = strlen(zpet); for (int i = 0; i < l / 2; i++) { char c = zpet[i]; zpet[i] = zpet[l - i - 1]; zpet[l - i - 1] = c; } // zpet++; /* char *res = zpet; for (int i = 0; i < l - 1; i++) { if (zpet[i] == '0') { res = &zpet[i+1]; if (zpet[i+1] != '0') break; } } // res = zpet; return res;*/ return zpet; } void provedTo(char *a, char* b, int zaklad) { // long int c1 = prevod(a, zaklad); // long int c2 = prevod(b, zaklad); // printf(" >>>(%d %d)<<< ", c1,c2); // long int soucet = c1 + c2; printf("%s + %s = %s\n", a, b, soucet2(a, b, zaklad)); } int main() { int zaklad; char a[1001], b[1001]; while (true) { scanf("%d", &zaklad); if (zaklad == 0) break; scanf("%s %s", a, b); provedTo(a, b, zaklad); } return 0; }