zoukankan      html  css  js  c++  java
  • Project Euler Problem 17

    Problem 17

    If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.

    If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?


    NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.

     

    #include <stdio.h>

    int numLetters1_19[] =
    {
        sizeof("one") - 1,
        sizeof("two") - 1,
        sizeof("three") - 1,
        sizeof("four") - 1,
        sizeof("five") - 1,
        sizeof("six") - 1,
        sizeof("seven") - 1,
        sizeof("eight") - 1,
        sizeof("nine") - 1,
        sizeof("ten") - 1,
        sizeof("eleven") - 1,
        sizeof("twelve") - 1,
        sizeof("thirteen") - 1,
        sizeof("fourteen") - 1,
        sizeof("fifteen") - 1,
        sizeof("sixteen") - 1,
        sizeof("seventeen") - 1,
        sizeof("eighteen") - 1,
        sizeof("nineteen") - 1,
    };

    int numLetters2Tens[] =
    {
        sizeof("twenty") - 1,
        sizeof("thirty") - 1,
        sizeof("forty") - 1,
        sizeof("fifty") - 1,
        sizeof("sixty") - 1,
        sizeof("seventy") - 1,
        sizeof("eighty") - 1,
        sizeof("ninety") - 1,
    };

    #define GET_NUM_LETTERS_1_19(N) numLetters1_19[N - 1]
    #define GET_NUM_LETTERS_2Tens(N) numLetters2Tens[N - 2]

    int numLettersHundred = sizeof("hundred") - 1;
    int numLettersAnd = sizeof("and") - 1;
    int numLettersThound = sizeof("thousand") - 1;

    int countLettersLessThan1000(int num)
    {
        int numLetters = 0;

        int nThousand = num / 1000;
        if (nThousand > 0)
        {
            numLetters += GET_NUM_LETTERS_1_19(nThousand);
            numLetters += numLettersThound;
        }

        num = num % 1000;

        int nHundred = num / 100;
        bool hasHundred = false;
        if (nHundred > 0)
        {
            numLetters += GET_NUM_LETTERS_1_19(nHundred);
            numLetters += numLettersHundred;
            hasHundred = true;
        }

        num = num % 100;

        if (num > 0)
        {
            if (hasHundred)
            {
                numLetters += numLettersAnd;
            }

            if (num <= 19)
            {
                numLetters += GET_NUM_LETTERS_1_19(num);
            }
            else
            {
                int nTens = num / 10;
                numLetters += GET_NUM_LETTERS_2Tens(nTens);

                num = num % 10;

                if (num > 0)
                {
                    numLetters += GET_NUM_LETTERS_1_19(num);
                }
            }
        }

        return numLetters;
    }

    int main(int argc, char* argv[])
    {
        int totalNumLetters = 0;

        for (int i = 1; i <= 1000; ++i)
        {
            totalNumLetters += countLettersLessThan1000(i);
        }

        printf("%d\n", totalNumLetters);

        return 0;
    }
  • 相关阅读:
    PAT-乙级-1011. A+B和C (15)
    PAT-乙级-1010. 一元多项式求导 (25)
    PAT-乙级-1009. *说反话 (20)
    PAT-乙级-1008. 数组元素循环右移问题 (20)
    PAT-乙级-1007. 素数对猜想 (20)
    PAT-乙级-1006. 换个格式输出整数 (15)
    PAT-乙级-1005. 继续(3n+1)猜想 (25)
    PAT-乙级-1004. 成绩排名 (20)
    BZOJ 1030: [JSOI2007]文本生成器
    BZOJ 2938: [Poi2000]病毒
  • 原文地址:https://www.cnblogs.com/Henrya2/p/2696230.html
Copyright © 2011-2022 走看看