#include #include static const char * ws (const char *p) { while (*p == ' ' || *p == '\t') p++; return p; } #define LEN(STR) (sizeof (STR) - 1) #define CMP(PTR, STR) (memcmp (PTR, STR, LEN (STR))) int main (void) { char buf[10240]; while (gets (buf) && *buf != 0) { const char *p; int val, sign, tmp; val = 0; sign = 1; tmp = 0; p = buf; for (;;) { p = ws (p); if (*p == 0) break; if (CMP (p, "negative") == 0) { p += LEN ("negative"); sign = -1; } else if (CMP (p, "hundred") == 0) { p += LEN ("hundred"); if (tmp == 0) tmp = 1; tmp *= 100; } else if (CMP (p, "thousand") == 0) { p += LEN ("thousand"); if (tmp == 0) tmp = 1; val += tmp * 1000; tmp = 0; } else if (CMP (p, "million") == 0) { p += LEN ("million"); if (tmp == 0) tmp = 1; val += tmp * 1000000; tmp = 0; } else { static const struct { const char *str; size_t len; int val; } vals[] = { #define V(S, V) { S, LEN (S), V } V ("eleven", 11), V ("twelve", 12), V ("thirteen", 13), V ("fourteen", 14), V ("fifteen", 15), V ("sixteen", 16), V ("seventeen", 17), V ("eighteen", 18), V ("nineteen", 19), V ("twenty", 20), V ("thirty", 30), V ("forty", 40), V ("fifty", 50), V ("sixty", 60), V ("seventy", 70), V ("eighty", 80), V ("ninety", 90), V ("zero", 0), V ("one", 1), V ("two", 2), V ("three", 3), V ("four", 4), V ("five", 5), V ("six", 6), V ("seven", 7), V ("eight", 8), V ("nine", 9), V ("ten", 10) }; size_t i; for (i = 0; i < sizeof (vals) / sizeof (*vals); i++) { if (memcmp (p, vals[i].str, vals[i].len) == 0) { p += vals[i].len; tmp += vals[i].val; break; } } if (i == sizeof (vals) / sizeof (*vals)) abort (); } } val += tmp; val *= sign; printf ("%d\n", val); } return EXIT_SUCCESS; }