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;}