#include #include int p10(int i) { int n = 1, j; for (j = 0; j < i; j++) n *= 10; return n; } int Choose(char old[40], int base, int len) { if (!len) return 1; int n = 0, x = 0, i; char line[40]; strcpy(line, old); for (i = len -1; i >= 0; i--) { x += p10(len - 1 - i) * (line[i] - '0'); line[i] = 0; if (x >= base) return n; if (x / p10(len-i - 1) || !x) { n += Choose(line, base, i); // printf("Choosing : %s : %i : %i = %i\n", line, base, i, n); } } return n; } int Select(char old[40], int len) { char line[40]; strcpy(line, old); int n = 0, x = 0, i; if (len < 2) return 0; for (i = len -1; i > 0; i--) { x += p10(len - 1 - i) * (line[i] - '0'); line[i] = 0; if (x / p10(len-i-1)) { n += Choose(line, x, i); // printf("Choosing 1st: %s : %i : %i = %i\n", line, x, i, n); } } return n; } int main() { int n, len; char line[40]; 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; }