#include #include #include #include int count(char* cislo, int len, char* base) { int best[40]; memset(best, 0, sizeof(best)); best[0] = 1; int blen = strlen(base); //printf("base=%s\n", base); for (int i = 1; i <= len; i++) { char c[40]; memset(c, 0, sizeof(c)); int ci = 0; int j = i - 1; bool zero = cislo[j] == '0'; while (j < len) { c[ci++] = cislo[j]; int clen = ci; //printf("testing %s\n%d %d %d\n", c, clen, blen, strcmp(c, base)); if (clen > blen || (strcmp(c, base) >= 0)) { //printf("failed\n"); break; } //printf("adding %d to pos. %d\n", best[i-1], j+1); best[j+1] += best[i-1]; ++j; if (zero) break; } } return best[len]; } int main() { char cislo[40]; for (;;) { fgets(cislo, 39, stdin); if (cislo[0] == '#') break; int c = 0, c1, i = strlen(cislo) - 2; cislo[i+1] = '\0'; while(i > 0) { if (cislo[0] != '0' || i <= 1) { char* base = cislo + i; int blen = strlen(base); //printf("base=%d\n", base); if ((blen > 1 || base[0] != '1') && cislo[i] != '0') { c1 = count(cislo, i, base); //printf("c=%d\n\n", c1); c += c1; } } --i; } if (c == 0) printf("The code %s is invalid.\n", cislo); else printf("The code %s can represent %d numbers.\n", cislo, c); } return 0; }