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



所以我现在正在解决projecteuler.net中的问题,在第17个问题中,我遇到了一个长度比实际解决方案长100的问题。

问题描述如下:

如果数字1到5是用单词写的:一、二、三、四,则总共使用3+3+5+4+4=19个字母。

如果从1到1000(包括1000(的所有数字用文字写出来,会用多少个字母?

注意:不要计算空格或连字符。例如,342(三百四十二(包含23个字母和115(一百一十五(包含20个字母。写数字时使用"one_answers"符合英国用法。

对于我的代码,我有一个:

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

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

编辑:我对python还很陌生,所以我有什么可以改进的地方,请在评论中告诉我!

我的问题是,我的代码出了什么问题

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

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

说明:==运算符测试相等性,但is测试对象标识。在本例中,有两个不同的int对象等于3000,但它们不是同一对象,因此is给出False

一个问题可能是:

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

应该是:

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

另一个问题可能是40的拼写,它应该是"四十"而不是"四十">

最新更新