Problem17

#include <iostream>
#include <string>
using namespace std;

#define NUM 1000

string
numlen(int n)
{
    if (n == 1000)
    {
        return "onethousand";
    }

    string s;

    char fig1[10][7] = {
        "zero",
        "one",
        "two",
        "three",
        "four",
        "five",
        "six",
        "seven",
        "eight",
        "nine"
    };

    char fig2[11][10] = {
        "ten",
        "eleven",
        "twelve",
        "thirteen",
        "fourteen",
        "fifteen",
        "sixteen",
        "seventeen",
        "eighteen",
        "nineteen"
    };

    char fig3[10][8] = {
        "*",
        "*",
        "twenty",
        "thirty",
        "forty",
        "fifty",
        "sixty",
        "seventy",
        "eighty",
        "ninety"
    };

    if (10 <= n%100 && n%100 <= 19)
    {
        s += fig2[n%10];
        n /= 100;
        if (n == 0)
        {
            return s;
        }        
    }
    else
    {
        s += fig1[n%10];
        n /= 10;
        if (n == 0)
        {
            return s;
        }
        
        string t = fig3[n%10];
        if (s == "zero")
        {
            s = "";
        }
        else
        {
//            t += "-";
        }
        t += s;
        s = t;
        n /= 10;
        if (n == 0)
        {
            return s;
        }
    }

    string t = fig1[n%10];
    t += "hundred";
    if (s.find("*") != s.npos)
    {
        s.erase(0, 1);
        if (s.size() != 0)
        {
            t += "and";
        }
    }
    else if (s == "_")
    {
        s = "";
    }
    else
    {
        t += "and";
    }
    t += s;
    s = t;

    return s;
}

int
main(int argc, char **argv)
{
    int ans = 0;

    for (int i = 1; i <= NUM; i++)
    {
        string s = numlen(i);
        ans += s.size();
    }

    cout << ans << endl;

    return 0;
}