Python Project Euler 17回答错误数位数

Python Project Euler 17回答错误数位数,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我已经把所有东西都编码好了,我认为它工作正常。我应该得到的答案是21124,但我得到21116。代码是这样的,有点长,我还想了解一些关于如何使我的代码看起来更小以用于未来项目的建议。问题是欧拉17号项目 如果数字1到5是用文字写出来的:一、二、三、四、五,那么总共使用了3+3+5+4+4=19个字母 如果所有从1到1000(一千)的数字都是用文字写出来的,那么会使用多少个字母 注意:不要计算空格或连字符。例如,342(三百四十二)包含23个字母,115(一百一十五)包含20个字母。写数字时使用“

我已经把所有东西都编码好了,我认为它工作正常。我应该得到的答案是21124,但我得到21116。代码是这样的,有点长,我还想了解一些关于如何使我的代码看起来更小以用于未来项目的建议。问题是欧拉17号项目

如果数字1到5是用文字写出来的:一、二、三、四、五,那么总共使用了3+3+5+4+4=19个字母

如果所有从1到1000(一千)的数字都是用文字写出来的,那么会使用多少个字母

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


正如我在评论中所说,您的代码中有一些错误,这意味着虽然您的数字很接近,但这只是巧合。打印出您的数字会产生一些问题,如数字100、114等。关于您的第二条评论,使您的代码变小,这个问题让我很感兴趣,想看看我将如何编写它。现在我确信会有更多的成功和简洁的答案,下面就是我为解决这个问题而写的。它主要关注的是以“onethousand”开头的单词字符串,然后处理数字1到999。我们将数字转换成一个字符串,并用前导0填充它,因此所有字符串的长度都是3个字符。1变为001,等等。然后我们说,如果这个单位的值不是0,那么做点什么

num_words={“1”:“1”,“2”:“2”,“3”:“3”,“4”:“4”,“5”:“5”,“6”:“6”,“7”:“7”,“8”:“8”,
“9”:“9”,“10”:“10”,“11”:“11”,“12”:“12”,“13”:“13”,“14”:“14”,“15”:“15”,
“16”:“十六”,“17”:“十七”,“18”:“十八”,“19”:“十九”,“20”:“二十”,“30”:“三十”,
“40:“四十”,“50:“五十”,“60:“六十”,“70:“七十”,“80:“八十”,“90:“九十”}
words=“一个小时”
对于范围(1000)内的i:
num=f“{i:03}”
num_word=“”
如果num[0]!="0":
num_word+=num_words[num[0]+“一百”
如果int(num[1:])!=0:
num_word+=“和”
如果数字[1]!="0":
如果num[1:]在num_字中:
num_word+=num_words[num[1:]
其他:
num_word+=num_words[num[1]+“0”]
如果数字[2]!="0":
如果num[1:]不是num_单词:
num_word+=num_words[num[2]]
单词数+=num_单词
印刷品(文字)

这将给出21124的输出,您必须重新考虑您的算法。并尝试通过定义合适的案例来构建不同的结构

在您的代码中,我们可以看到您对2个数字长度和3个数字长度做了一个特例。。。实际上,你应该尽可能地遵循共同语言规则

所以你必须提取一些值

让我们从这些规则开始:

  • 11到19之间的数字是“青少年”数字
  • 介于1和9之间的数字是简单的数字,按原样表示
  • 10的倍数是10,20…90
  • 100的倍数是简单数+100
  • 1000的倍数高于规则+thounsand
  • 然后从1到99万就很容易了,你使用与上面相同的规则,每1000,百万,以此类推
所以你要做的就是提取千,比如千,可以是1000到999999之间的任意数字

要提取数千,您必须执行以下操作:

num // 1000 % 1000
这将给你数千美元。。。然后你只需要像往常一样把它解析为一个介于1和999之间的数字

然后,您必须提取1000以下的剩余999

您可以这样做:

num % 1000
现在你必须解析从1到999的数字

您需要首先使用num//100提取HunDards,因此如果您的值大于0,则意味着您可以解析简单的数字(1-9)+100

然后你必须用num%100解析剩下的99个

如果数字在1到9之间,它是一个简单的数字

如果在10到19之间,这是一个青少年数字

如果大于或等于20,则必须提取10和简单数的倍数

您可以使用num//10和num%10执行此操作。 然后,您所要做的就是找到num//10的倍数和num%10的简单数字

如果找到一个0,则不分析它

因此,解析像234234这样的数字应该得到如下结果

two hundred thirty-four thousand two hundred thirty four 
你可以看到这个数字在重复。。以千、百万等分隔。这对你来说意味着,如果你想把euler挑战更进一步,你可以记忆你的函数,以便处理从1到99的数字,然后从1到9+1-99的数字。你不用做999操作,而是做大约9+10+80+9来处理所有事情。所以,如果你计算99次,你就可以重复使用199299399等的值。。。为了进一步测试,因为它只要求字母的数量,你可以通过知道如果你有

9乘以99个字母,您可以将每个字母的数量乘以数百个字母的数量,然后对结果求和,而无需计算任何内容。这意味着你甚至不必计算所有的数字


你只需将1,2,3,4,6,7,8,9的字母相加,再乘以99的数字,就可以减少大量的计算量

仅使用一些打印语句,您的代码就有一些问题,如果我们打印出列表中附加的所有内容,您可以看到,虽然您的答案是接近的,但它是完全错误的。对于数字
100111114
打印为
onehundred,onehundredtenone,onehundandtenfour
,因此当您的数字接近时,它只是碰巧接近,您需要首先对错误进行排序
two hundred thirty-four thousand two hundred thirty four