若是把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
所有累加便可獲得所有字母數