我正在尝试解决Project Euler问题17,并且我已多次调试此代码。但是,我得到了22048,这是错误的。这是问题所在:
如果数字1到5用文字写出:一,二,三,四,五,那么总共有3 + 3 + 5 + 4 + 4 = 19个字母。
如果所有1到1000(一千)的数字都用文字写出来,会用多少个字母?
注意:不要计算空格或连字符。例如,342(三百四十二)包含23个字母,115(一百一十五)包含20个字母。在写出数字时使用“和”符合英国的用法。
你能帮我解决一下如何修复我的Python解决方案吗?
key = {
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',
30: 'thirty',
40: 'forty',
50: 'fifty',
60: 'sixty',
70: 'seventy',
80: 'eighty',
90: 'ninety',
100: 'hundred',
1000: 'thousand',
}
sum = 0
def digits(number):
return [int(i) for i in str(number)]
for num in range(1, 1001):
if num <= 20:
sum = sum + len(key[num])
elif num <= 99:
sum = sum + len(key[((digits(num))[0] * 10)])
if (digits(num))[1] != 0:
sum = sum + len(key[(digits(num))[1]])
elif num <= 999:
tridig = digits(num)
sum = sum + tridig[0] + len(key[100]) + 3 # for the "and"
lasttwo = tridig[1] * 10 + tridig[2]
if lasttwo > 0:
if lasttwo <= 20:
sum = sum + len(key[lasttwo])
else:
sum = sum + len(key[((digits(lasttwo))[0] * 10)])
if (digits(lasttwo))[1] > 0:
sum = sum + len(key[(digits(lasttwo))[1]])
else:
sum = sum + len(key[1000])
print sum
答案 0 :(得分:0)
如果lasttwo == 0
那么就没有'和'(200是'二百',而不是'二百'和'),但在测试if lasttwo > 0
之前,你为'和'添加了3。
答案 1 :(得分:0)
主要问题在于elif num < 999
阻止 - 您正在添加&#39;和&#39;&#39;在检查是否有更多数字之前。您的代码将受益于使用单独的函数来计算数字的字母,然后您可以在计算“四百”和“数字”时递归调用它。 X
你在1000的情况下还有另外一个问题,但是那个应该更容易找到,所以我会留给你:)