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