如果用英文寫出數字1到5: one, two, three, four, five, 那麼一共需要3 + 3 + 5 + 4 + 4 = 19個字母。
如果數字1到1000(包含1000)用英文寫出,那麼一共需要多少個字母?
注意: 空格和連字元不算在內。例如,
342 (three hundred and forty-two)包含23個字母;
115 (one hundred and fifteen)包含20個字母。
「and」 的使用與英國標準一致。
# 分類求解1
all_text = open('euler17.txt').read()
all_text = all_text.splitlines()
arr_dict =
for line in all_text:
num, english = line.split(' ')
arr_dict[int(num)] = len(english)
len_1_9 = sum([arr_dict[i] for i in range(1, 10)])
len_10_19 = sum([arr_dict[i] for i in range(10, 20)])
len_20_99 = sum([arr_dict[i] * 10
for i in range(20, 100, 10)]) + len_1_9 * 8
len_100_999 = len_1_9 * 100 + \
arr_dict[100] * 900 + arr_dict['and'] * (900 - 9) + (len_1_9 + len_10_19 + len_20_99) * 9
len_1000 = arr_dict[1000] + arr_dict[1]
print(len_1_9 + len_10_19 + len_20_99 + len_100_999 + len_1000)
# 分類求解2
len_all = 0
for i in range(1, 1000):
if i < 20:
len_all += arr_dict[i]
elif i < 100:
n_1 = i % 10
n_2 = i - n_1
len_all += arr_dict[n_1] + arr_dict[n_2]
elif i < 1000:
n_1 = i % 10
n_2 = i // 10 % 10 * 10
n_3 = i // 100
len_all += arr_dict[n_3] + arr_dict[100]
if n_2 != 0
or n_1 != 0:
len_all += arr_dict['and']
if n_2 < 20:
len_all += arr_dict[n_2 + n_1]
else:
len_all += arr_dict[n_2] + arr_dict[n_1]
print(len_all + len_1000)
txt內容
1
one2
two3
three
4four
5five
6six
7seven
8eight
9nine
10ten
11 eleven
12 twelve
13 thirteen
14 fourteen
15 fifteen
16 sixteen
17 seventeen
18 eighteen
19 nineteen
20 twenty
30 thirty
40 forty
50 fifty
60 sixty
70 seventy
80 eighty
90 ninety
100 hundred
1000 thousand
尤拉計畫 6
前十個自然數的平方和是 1 2 2 2 10 2 385 前十個自然數的和的平方是 1 2 10 2 552 3025 所以平方和與和的平方的差是3025 385 2640.找出前一百個自然數的平方和與和平方的差。def get square sub x 遞迴,展開行列式 if x 1 return...
尤拉計畫 14
以下迭代序列定義在整數集合上 n n 2 當n是偶數時 n 3n 1 當n是奇數時 應用以上規則,並且以數字13開始,我們得到以下序列 13 40 20 10 5 16 8 4 2 1 可以看出這個以13開始以1結束的序列包含10個項。雖然還沒有被證明 collatz問題 但是人們認為在這個規則下,...
尤拉計畫 15
從乙個2 2網格的左上角開始,有6條 不允許往回走 通往右下角的路。對於20 20的網格,這樣的路有多少條?def get load num x,y x,y 網格的路數等於 x 1,y x,y 1 if x 0 or y 0 return 1return get xy load x 1,y get ...