[Project Euler]加入歐拉 Problem 17

來源:互聯網
上載者:User

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.

 

計算1到1000中所有數使用的英文字母數。不計連字號。

這個題目看起來挺唬人的,其實分析下就不難了。下面這個是英文拼字單詞的用法:

 

one 、two 、three 、four 、five 、six 、seven 、eight 、nine 、ten ——這是基本的數字,一定要記!
eleven 、twelve、thirteen 、fifteen 、 ——11、12、13、15比較特殊,也是要記!

fourteen 、sixteen 、seventeen 、eighteen 、nineteen——這裡就有規律可循,14、16、17、18、19均是在4、6、7、8、9後面加上 teen。
twenty 、thirty 、forty、 fifty ——20、30、40、50也是比較特殊,死記唄!

sixty 、seventy 、eighty、 ninety ——60、70、90均是在6、7、9後面加ty,而80裡,8(eight)已經有t,直接加y。

以下依次是在20、30、40、50、60、70、80、90後面寫連詞符號(-)再加上基本數字。如21就是在20(twenty)後面寫上連詞符號(-),再加上1(one)

一百:one/a hundred

one hundred and one、one hundred and two……one hundred and fifty(一百零一、一百零二……一百五十)

一百零一到一百五十的數字,用one hundred and …,and後面加上數字

如:

一百一十:one hundred and ten

一百一十五:one hundred and fifteen

一百二十:one hundred and twenty

一百二十五:one hundred and twenty-five

看完上面就知道了規律了:

首先個位元,這個不用說,就9個。

其次最重要的分析十位元,十位元裡面1開頭的和其他的是有區別的,這個要特殊對待。 一點點分析。

再次三位元的時候就很簡單了,可以拆分為 one hundred and 這樣的格式,這裡三位元要注意兩點:

a. 整百的數,比如200 two hunderd。這樣的數是不帶and的,所以要特別注意

b. 剩下的就是三位元的拆分了,三位元有兩種 幾百 + 幾十的,還有幾百加幾個的。

下面就是代碼了:

歐拉項目第十七道題#include <stdio.h>#include <stdlib.h>int WordLenDoubleDigit(int number); int WordLenThreeDigit(int number); // 定義個位元字數組分別對應0, 1, 2, 3, 4, 5, 6, 7, 8, 9英文單詞長度 // 0作為一個假值出現 const int arr[10] = {0, 3, 3, 5, 4, 4, 3, 5, 5, 4}; int main(int argc, char *argv[]){    int sum = 0;        int i = 0;        for(i = 1; i <= 1000; i++)    {        if(i / 10 == 0) // 如果是個位元        sum += arr[i];                if(i / 10 >= 1 && i / 10 <= 9) // 如果是兩位元        sum += WordLenDoubleDigit(i);                            if(i / 100 >= 1 && i / 100 <= 9) // 如果是三位元         sum += WordLenThreeDigit(i);                        if(i / 1000 == 1) // 如果是四位元         sum += 11;    }            printf("%d", sum);     system("PAUSE");  return 0;}int WordLenDoubleDigit(int number){    int len = 0;                    switch(number / 10)    {        case 1: // 如果是 10, 11, 12, 13, 14, 15, 16, 17, 18, 19裡面的數        switch(number % 10)        {            case 0: // 10            len = 3;            break;            case 1:             case 2: // 11, 12            len = 6;            break;            case 3: // 13            len = 8;            break;            case 5: // 15            len = 7;            break;            case 8: // 18            len = 8;            break;            default: // 其他數                 len = arr[number % 10] + 4; // 後面加上teen                break;                            }        break;                                        case 2:        case 3:        case 8: // 如果是20, 30, 80裡面的數        len = arr[number % 10] + 6;        break;                        case 4:        case 5: // 如果是 40, 50裡面的數         len = arr[number % 10] + 5;        break;                        default: // 60, 70, 90裡面的數,對應數字後面加ty                                len = arr[number / 10] + 2 + arr[number % 10];            break;        }        return len;    }int WordLenThreeDigit(int number){    int len = 0;        if(number % 100 == 0) // 剛好是100, 200等這樣的數,後面是沒有and 的    len = arr[number / 100] + 7;    else    {        if(number % 100 >= 1 && number % 100 <= 9 )  // 如果是101 - 109這樣的數         len = arr[number / 100] + 10 + arr[number % 100];        else        len = arr[number / 100] + 10 + WordLenDoubleDigit(number % 100);    }        return len;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.