#include #include #define MAX_GROUPS 22 #ifdef DEBUG #define PRINT(x) printf x #else #define PRINT(x) #endif typedef struct BIGNUM { int sign; int num[MAX_GROUPS]; } BIGNUM; char *revstr(char *s) { size_t len = strlen(s); char *p, *q, *t = s; char ch; p = s; q = p + len - 1; while(p < q) { ch = *p; *p++ = *q; *q-- = ch; } return t; } void MakeBigNum(BIGNUM *b, char *s) { int idx = 0; int count = 0; int mult; BIGNUM t = {0}; memcpy(b, &t, sizeof t); revstr(s); mult = 1; while(*s && *s != '-') { b->num[idx] += mult * (*s - '0'); mult *= 10; ++count; if(count % 3 == 0) { mult = 1; ++idx; } ++s; } b->sign = (*s == '-') ? -1 : 1; } void Expand(int i) { char *digit[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; char *teen[] = { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; char *ty[] = { "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; if(i >= 100) { printf("%s hundred %s ", digit[i / 100 - 1], i % 100 ? "and" : ""); i %= 100; } if(i < 20 && i >= 10) { printf("%s", teen[i - 10]); } else { if(i >= 20) { printf("%s ", ty[i / 10 - 2]); i %= 10; } if(i > 0) { printf("%s", digit[i - 1]); } } } void PrintBigNum(BIGNUM *b) { char *Words[MAX_GROUPS] = { "", "thousand", "million", "billion", "trillion", "quadrillion", "pentillion", "hexillion", "heptillion", "octillion", "nonillion", "decillion", "monodecillion", "duodecillion", "tertiadecillion", "tetradecillion", "quindecillion", "sexadecillion", "septadecillion", "octadecillion", "nonadecillion", "icosillion" }; int dirty = 0; int count = MAX_GROUPS - 1; if(b->sign == -1) { printf("minus "); } while(count >= 0) { if(b->num[count] > 0) { dirty = 1; Expand(b->num[count]); printf(" %s ", Words[count]); } --count; } if(!dirty) printf("zero"); printf(".\n"); } int main(int argc, char **argv) { BIGNUM b; if(argc > 1) { MakeBigNum(&b, argv[1]); PrintBigNum(&b); } return 0; }