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