项目欧拉17

时间:2014-01-16 19:09:10

标签: python

此问题是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)

1 个答案:

答案 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被写成“九百一十四”,那么就更容易意识到某些东西已经关闭。

相关问题