#include #include #define MAXL 64 static char buf[MAXL]; __inline__ static unsigned count (size_t base, size_t blen) { static unsigned cnts[MAXL]; size_t i; cnts[0] = 1; for (i = 1; i <= base; i++) cnts[i] = 0; for (i = 0; i < base; i++) { int z, cmp; size_t j; cmp = 0; z = 1; for (j = i + 1; j <= base; j++) { if (j - i > blen) break; if (cmp == 0) { if (buf[j - 1] > buf[base + j - 1 - i]) cmp = 1; else if (buf[j - 1] < buf[base + j - 1 - i]) cmp = -1; } if (j - i == blen && cmp >= 0) break; if (j > i + 1 && buf[i] == '0') break; if (buf[j - 1] != '0') z = 0; if (z != 0 && i == 0 && j != base) continue; #if 0 printf ("F: %.*s\n", (int)(j - i), buf + i); #endif cnts[j] += cnts[i]; } } #if 0 for (i = 0; i <= base; i++) printf ("%u ", cnts[i]); putchar ('\n'); #endif return cnts[base]; } int main (void) { for (;;) { size_t len, total, i; fgets (buf, sizeof (buf), stdin); if (*buf == '#') break; len = strlen (buf); if (buf[len - 1] == '\n') { len--; buf[len] = 0; } total = 0; for (i = 1; i < len; i++) { if (buf[i] != '0') total += count (i, len - i); } if (total != 0) printf ("The code %s can represent %u numbers.\n", buf, total); else printf ("The code %s is invalid.\n", buf); } return EXIT_SUCCESS; }