#include <iostream>
using std::cout;
using std::string;
using std::endl;
string toWords(int num) {
if (num > 100 || num < 1) {
throw "unsupported";
}
if (num == 100) {
return "one hundred";
}
const string kSpecialCases[] = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
if (10 <= num && num <= 19) {
return kSpecialCases[num - 10];
}
const string kOnesPlaces[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
const string kTensPlaces[] = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
if (num < 10) {
return kOnesPlaces[num - 1];
} else if (num % 10 == 0) {
return kTensPlaces[num / 10 - 2];
} else {
return kTensPlaces[num / 10 - 2] + " " + kOnesPlaces[num % 10 - 1];
}
}
int main() {
cout << toWords(1) << endl;
cout << toWords(100) << endl;
cout << toWords(12) << endl;
cout << toWords(29) << endl;
cout << toWords(46) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OnN0cmluZzsKdXNpbmcgc3RkOjplbmRsOwoKc3RyaW5nIHRvV29yZHMoaW50IG51bSkgewogIGlmIChudW0gPiAxMDAgfHwgbnVtIDwgMSkgewogICAgdGhyb3cgInVuc3VwcG9ydGVkIjsKICB9CiAgaWYgKG51bSA9PSAxMDApIHsKICAgIHJldHVybiAib25lIGh1bmRyZWQiOwogIH0KCiAgY29uc3Qgc3RyaW5nIGtTcGVjaWFsQ2FzZXNbXSA9IHsidGVuIiwgImVsZXZlbiIsICJ0d2VsdmUiLCAidGhpcnRlZW4iLCAiZm91cnRlZW4iLCAiZmlmdGVlbiIsICJzaXh0ZWVuIiwgInNldmVudGVlbiIsICJlaWdodGVlbiIsICJuaW5ldGVlbiJ9OwogIGlmICgxMCA8PSBudW0gJiYgbnVtIDw9IDE5KSB7CiAgICByZXR1cm4ga1NwZWNpYWxDYXNlc1tudW0gLSAxMF07CiAgfQoKICBjb25zdCBzdHJpbmcga09uZXNQbGFjZXNbXSA9IHsib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUifTsKICBjb25zdCBzdHJpbmcga1RlbnNQbGFjZXNbXSA9IHsidHdlbnR5IiwgInRoaXJ0eSIsICJmb3J0eSIsICJmaWZ0eSIsICJzaXh0eSIsICJzZXZlbnR5IiwgImVpZ2h0eSIsICJuaW5ldHkifTsKICBpZiAobnVtIDwgMTApIHsKICAgIHJldHVybiBrT25lc1BsYWNlc1tudW0gLSAxXTsKICB9IGVsc2UgaWYgKG51bSAlIDEwID09IDApIHsKICAgIHJldHVybiBrVGVuc1BsYWNlc1tudW0gLyAxMCAtIDJdOwogIH0gZWxzZSB7CiAgICByZXR1cm4ga1RlbnNQbGFjZXNbbnVtIC8gMTAgLSAyXSArICIgIiArIGtPbmVzUGxhY2VzW251bSAlIDEwIC0gMV07CiAgfQp9CgppbnQgbWFpbigpIHsKICBjb3V0IDw8IHRvV29yZHMoMSkgPDwgZW5kbDsKICBjb3V0IDw8IHRvV29yZHMoMTAwKSA8PCBlbmRsOwogIGNvdXQgPDwgdG9Xb3JkcygxMikgPDwgZW5kbDsKICBjb3V0IDw8IHRvV29yZHMoMjkpIDw8IGVuZGw7CiAgY291dCA8PCB0b1dvcmRzKDQ2KSA8PCBlbmRsOwogIHJldHVybiAwOwp9