我对Project Euler 17的解决方案有什么问题?

时间:2014-03-20 14:48:53

标签: python

我正在尝试解决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

2 个答案:

答案 0 :(得分:0)

如果lasttwo == 0那么就没有'和'(200是'二百',而不是'二百'和'),但在测试if lasttwo > 0之前,你为'和'添加了3。

答案 1 :(得分:0)

主要问题在于elif num < 999阻止 - 您正在添加&#39;和&#39;&#39;在检查是否有更多数字之前。您的代码将受益于使用单独的函数来计算数字的字母,然后您可以在计算“四百”和“数字”时递归调用它。 X

你在1000的情况下还有另外一个问题,但是那个应该更容易找到,所以我会留给你:)