#include #include #define p10(a) _p10[(a)] double _p10[35]; int Choose(char line[40], double base, int len) { if (!len) return 1; int n = 0, i; double x = 0; char store; for (i = len -1; i >= 0; i--) { x += p10(len - 1 - i) * (line[i] - '0'); store = line[i]; line[i] = 0; if (x >= base) { line[i] = store; return n; } if (store != '0' || !x) { n += Choose(line, base, i); // printf("Choosing : %s : %f : %i = %i\n", line, base, i, n); } line[i] = store; } return n; } int Select(char line[40], int len) { int n = 0, i; double x = 0; char store; if (len < 2) return 0; for (i = len -1; i > 0; i--) { x += p10(len - 1 - i) * (line[i] - '0'); store = line[i]; line[i] = 0; if (store != '0') { n += Choose(line, x, i); // printf("Choosing 1st: %s : %f : %i = %i\n", line, x, i, n); } line[i] = store; } return n; } int main() { int n, len; char line[40]; _p10[0] = 1; for (n = 1; n < 35; n++) _p10[n] = _p10[n-1]*10; while (fgets(line, 39, stdin) && line[0] != '#') { len = strlen(line); line[--len] = 0; n = Select(line, len); // printf("Selecting : %s : %i = %i\n", line, len, n); if (!n) printf("The code %s is invalid.\n", line); else printf("The code %s can represent %i numbers.\n", line, n); } return 0; }