表達數字的英文字母計數

若是把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 

所有累加便可獲得所有字母數

相關文章
相關標籤/搜索