表达数字的英文字母计数

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

所有累加便可获得所有字母数

相关文章
相关标签/搜索