因此,我目前正在解决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还是很陌生,所以我一般来说都有什么可以改进的地方,请在评论中让我知道!
我的问题是,我的代码有什么问题?
答案 0 :(得分:4)
我认为这不是您的代码唯一的问题,但这是一个简单的问题:不要在数字上使用is
或is 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的拼写,应该是“四十”而不是“四十”