欧拉项目问题#17-我的代码中的错误

时间:2019-11-08 12:41:30

标签: python

因此,我目前正在解决projecteuler.net中的问题,而对于第17个问题,我遇到了一个长度比实际解决方案长100的问题。

问题的描述如下:

  

如果数字1到5用文字写出:1、2、3、4,   五个,则总共使用了3 + 3 + 5 + 4 + 4 = 19个字母。

     

如果从1到1000(含1000)之间的所有数字均为   用文字写出来,将使用多少个字母?

     

注意:请勿计算空格或连字符。例如342(三百   和42个)包含23个字母和115个字母(115个)   包含20个字母。写出数字时使用“和”   遵守英国的用法。

对于我的代码,我有以下代码:

def problem17(max):
    numbers = {
        0:  0,
        1 : len('one'),
        2 : len('two'),
        3 : len('three'),
        4 : len('four'),
        5 : len('five'),
        6 : len('six'),
        7 : len('seven'),
        8 : len('eight'),
        9 : len('nine'),
        10: len('ten'),
        11: len('eleven'),
        12: len('twelve'),
        13: len('thirteen'),
        14: len('fourteen'),
        15: len('fifteen'),
        16: len('sixteen'),
        17: len('seventeen'),
        18: len('eighteen'),
        19: len('nineteen')
    }

    number_tenths = {
        2: len('twenty'),
        3: len('thirty'),
        4: len('fourty'),
        5: len('fifty'),
        6: len('sixty'),
        7: len('seventy'),
        8: len('eighty'),
        9: len('ninety')
    }

    hundred = len('hundred')
    thousand = len('thousand')
    andl = len('and')

    i = 1
    length = 0
    under_onehundred = lambda i: numbers[i] if i < 20 else number_tenths[math.floor(i / 10)] + numbers[i % 10]
    hundreds = lambda i: numbers[math.floor(i / 100)] + hundred
    while i <= max:
        if i < 100:
            length += under_onehundred(i)
        elif i % 100 == 0 and i % 1000 != 0:
            length += hundreds(i)
        elif i >= 100 and i < 1000:
            length += hundreds(i) + andl + under_onehundred(i % 100)
        elif i % 1000 == 0:
            length += numbers[math.floor(i / 1000)] + thousand

        i += 1

    return length

如果我用21224来调用,它将输出problem17(1000)而不是正确的答案。

编辑:我对python还是很陌生,所以我一般来说都有什么可以改进的地方,请在评论中让我知道!

我的问题是,我的代码有什么问题?

2 个答案:

答案 0 :(得分:4)

我认为这不是您的代码唯一的问题,但这是一个简单的问题:不要在数字上使用isis not;使用==!=代替。您可能会对以下行为感到惊讶:

>>> 1000 + 2000 is 3000
False
>>> 1000 + 2000 == 3000
True

说明:==运算符测试是否相等,但是is测试对象 identity 。在此示例中,有两个不同的int对象,它们等于 3000,但它们不是同一对象,因此is给出{{1 }}。

答案 1 :(得分:3)

一个问题可能是:

hundreds = lambda n: numbers[math.floor(i / 100)] + hundred

应为:

hundreds = lambda n: numbers[math.floor(n / 100)] + hundred

另一个问题可能是40的拼写,应该是“四十”而不是“四十”