Project Euler Problem 17

Problem 17
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全部写成英文,一个用了多少个英文字母
方法1:直接按不同数段进行计算
singles_list = ['','one','two','three','four','five','six','seven','eight','nine']
tens_list = ['ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen',
             'eighteen','nineteen']
decades_list = ['','','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
hundreds_list = ['hundredand']

def used_letters(n):
    if n < 10:
        length = len(singles_list[n])
        return length
    elif 10 <= n < 20:
        length = len(tens_list[n-10])
        return length
    elif 20 <= n < 100:
        deca = n // 10
        sin = n % 10
        length = len(decades_list[deca]) + len(singles_list[sin])
        return length
    elif 100 <= n < 1000:
        hundr = n // 100
        deca = (n % 100)// 10
        sin = n % 10
        if deca == sin == 0:
            hundr_len = len(singles_list[hundr]) + 7         # hundred
        else:
            hundr_len = len(singles_list[hundr]) + 10        # hundred and
        if deca == 1:                                        # 212 区分
            deca_len = len(tens_list[sin])
            length = hundr_len + deca_len
        else:
            length = hundr_len + len(decades_list[deca])\
                 + len(singles_list[sin])
        return length
    else:
        print('Data out of range.')

sum1 = 0
for i in range(1,1000):
    sum1 += used_letters(i)
print(sum1 + 11)  # 1000(one thousand)

方法2:可以定义三个函数,single decade hundred ,decade 调用single ,hundred 调用decade ,但是计算0~1000时,0~10,10~100,100~1000要分别调用三个函数
def single(n):                                          # 1~9
    singles_list = ['','one','two','three','four','five',
                   'six','seven','eight','nine']
    length = len(singles_list[n])
    return length

def decade(n):                                         # 11~99
    tens_list = ['ten','eleven','twelve','thirteen','fourteen','fifteen',
                'sixteen','seventeen','eighteen','nineteen']
    decades_list = ['','','twenty','thirty','forty','fifty',
                    'sixty','seventy','eighty','ninety']
    if 10 <= n < 20:
        length = len(tens_list[n-10])
    else:
        deca = n // 10
        sin = n % 10
        length = len(decades_list[deca]) + single(sin)
    return length

def hundred(n):                                       # 100~999
    hundr = n // 100
    deca = n % 100
    if deca == 0:
        length = single(hundr) + 7                    # hundred
    else:
        length = single(hundr) + decade(deca) + 10    # hundred and
    return length

def letters_sum(n):
    sum1 = 0
    for i in range(1,n):
        if i < 10:
            sum1 += single(i)
        elif i < 100:
            sum1 += decade(i)
        else:
            sum1 += hundred(i)
    return sum1

print(letters_sum(1000) + 11)                         # 1000(one thousand)
结果:21124

猜你喜欢

转载自blog.csdn.net/wxinbeings/article/details/80114024