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