若是把1到5写成英文单词,分别:one ,two,three,four, five,这些单词一共用了3+3+5+4+4=19个字母。算法
若是把1到1000都写成英文单词,一共要用多少个字母?函数
注意:不要算上空格和连字符。例如,342(three hundred and forty-two)包含23个字母,而115(one hundred and fifteen)包含20个字母。单词“and”的使用方式遵循英式英语的规则。测试
答案是:21124spa
算法以下:code
主函数:blog
public static int numberLetterCounts() { int sum = 0; for(int i=1;i<21;i++) { sum+= letterCountsOne(i); } for(int i=21;i<100;i++) { sum+= letterCountsTwo(i/10)+letterCountsOne(i%10); } for(int i=100;i<1000;i++) { if(i%100<=20) { sum += letterCountsOne(i/100)+(i%100==0?7:10)+letterCountsOne(i%100); //i%100==0?7:10 整除时只需加上hundred,非整除时须要加上hundred and }else { sum += letterCountsOne(i/100)+(i%100==0?7:10)+letterCountsTwo(i%100/10)+letterCountsOne(i%10); } } //one thousand sum+=11; return sum; }
计算1-20的字母数:three
public static int letterCountsOne(int num) { /** * 1 - one * 2 - two * 3 - three * 4 - four * 5 - five * 6 - six * 7 - seven * 8 - eight * 9 - nine * 10 - ten * 11 - eleven * 12 - twelve * 13 - thirteen * 14 - fourteen * 15 - fifteen * 16 - sixteen * 17 - seventeen * 18 - eighteen * 19 - nineteen * 20 - twenty * 21 - twenty-one * 22 - twenty-two * 23 - twenty-three * 24 - twenty-four * 25 - twenty-fifty * 26 - twenty-six * 27 - twenty-seven * 28 - twenty-eight * 29 - twenty-nine * 30 - thirty * 40 - forty * 50 - fifty * 60 - sixty * 70 - seventy * 80 - eighty * 90 - ninety * 100 - one hundred */ if(num == 1)return 3; if(num == 2)return 3; if(num == 3)return 4; if(num == 4)return 4; if(num == 5)return 5; if(num == 6)return 3; if(num == 7)return 5; if(num == 8)return 5; if(num == 9)return 4; if(num == 10)return 3; if(num == 11)return 6; if(num == 12)return 6; if(num == 13)return 8; if(num == 14)return 8; if(num == 15)return 7; if(num == 16)return 7; if(num == 17)return 9; if(num == 18)return 8; if(num == 19)return 8; if(num == 20)return 6; return 0; }
计算十位的字母数:event
public static int letterCountsTwo(int num) { if(num==2) return 6; if(num==3) return 6; if(num==4) return 5; if(num==5) return 5; if(num==6) return 5; if(num==7) return 7; if(num==8) return 6; if(num==9) return 6; return 0; }
测试:class
@Test public void testLetterCounts() { System.out.println(numberLetterCounts()); }
分析:test
这个算法题不难,可是须要大量的统计工做和部分逻辑的梳理,如百位、十位、个位的获取
20之内的字母数量统计能够直接经过letterCountsOne()获取
21-100之间的字母统计,能够经过除法(i/10)获取十位的数字做为参数传给letterCountsTwo()来获取字母数,个位可经过取余(i%10)获得,再传给letterCountsOne()
101-1000之间的字母统计,百位经过除法(i/100)便可获得,这时还须要对稍做判断,此时是否整除,整除只需加上hundred的字母数,不然须要加上hundred and的字母数
1000 - one thousand
所有累加便可获得所有字母数