此问题是Project Euler问题17.请参阅此处的问题:http://projecteuler.net/problem=17。
如果数字1到5用文字写出:一,二,三,四,五,那么总共有3 + 3 + 5 + 4 + 4 = 19个字母。
如果所有1到1000(一千)的数字都用文字写出来,会用多少个字母?
注意:不计算空格或连字符。例如,342(三百四十二)包含23个字母,115(一百一十五)包含20个字母。在写出数字时使用“和”符合英国的用法。
输出应该是21124但是根据以下代码,输出是21112.我试图在这段代码中找到错误,请帮忙!
dict = {} #empty dictionary
dict[0]=0
dict[1]=3
dict[2]=3
dict[3]=5
dict[4]=4
dict[5]=4
dict[6]=3
dict[7]=5
dict[8]=5
dict[9]=4
dict[10]=3
dict[11]=6
dict[12]=6
dict[13]=8
dict[14]=8
dict[15]=7
dict[16]=7
dict[17]=9
dict[18]=8
dict[19]=8
dict[20]=6
dict[30]=6
dict[40]=5
dict[50]=5
dict[60]=5
dict[70]=7
dict[80]=6
dict[90]=6
dict[100]=7
dict[1000]=11
sum = 0
#sumation for single digit numbers
for i in range(1,11):
sum += dict[i]
#summation for numbers less than 20
for i in range(11,21):
sum += dict[i]
#for sumation upto hundred terms
for i in range(21,100):
j = i
sum += (dict[(j - j%10)])
sum += dict[j%10]
sum+=dict[1]+dict[100]
#for numbers from 101 to 999
for i in range(101,1000):
print("sum = "+str(sum)+" i = "+str(i))
sum += dict[int(i/100)]+dict[100]
sum += dict[i%100-(i%10)]+dict[i%10]
sum += len("and")
sum += dict[1000]
print("Total = %d"%sum)
答案 0 :(得分:1)
问题在于914
这样的数字,你将被视为“9 100和10 4”(九个houndred和十个四个),它们的字母数量与“9 100和14”相同“(九个小时和十四个)。
此问题源于
sum += dict[int(i/100)]+dict[100]
sum += dict[i%100-(i%10)]+dict[i%10]
对于i
这样的i=914
,第二行的计算就像这样
i%100-(i%10) == 914%100 - 914%10 == 14 - 4 == 10
此外,像900这样的数字不称为“九百和”,但即使len("and")
,您的代码也会添加i%100 == 0
。
因此,您需要以十倍的方式处理青少年的倍数和数字。
作为类似练习的提示,我建议你将实际的字符串存储在字典中(例如dict[13] = 'thirteen')
然后使用len(dict[13])
来获取数字。这样你就可以安全地避免傻计数错误并且可以更容易地验证计算。毕竟,如果你发现你的代码声称914
被写成“九百一十四”,那么就更容易意识到某些东西已经关闭。