Euler项目#8-在数字上找到N相邻数字的最大产品.代码仅适用于n的某些值



我一直在Python的Project Euler#8工作。任务是在这个很长的数字中寻找13个相邻数字的最高产品:

731671765313306249192251196744265747423534919493496983520312774506326239578318016984801869478851843858615607891129494949545959501737958331952853208805511125406987471585238630507156932909632952274433576689664895045245231617318564030987112172238311362229893423380303533333627661428282806444444444444523874930358907296290491560444077239071381051585930796086670172427121883998797979087922749219016972088880937766572733300105336788122022023542180975125454594752243525849077116705560136048395864670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319898900088952434506585412275886668811642717147992442928233086346567481391231628245861786645835912456529476545682848912883142607690042242190226710556263211111093705442175069416589604080719840385096245444444362981230987878799272442849091888458015616609791919133875499200524063689991256076060588611646710940507754100225698315555555593572972571636269561882670428252483600823257530420752963450

例如,前五位数字的产物是7 * 3 * 1 * 6 * 7 = 882。

以下是我写的代码:

i = '''73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450'''
def mult(x):
    product = 1
    for num in x:
        if num != 'n':
            product *= int(num)
        else:
            continue
    return product
def main(x,y):
    z = 0
    num = 0
    while y < len(x):
        k = list(x[z:y])
        if mult(k) > num:
            num = mult(k)
        z += 1
        y += 1
    print(num)

运行程序后寻找四个相邻数字的最大产品(y = 4(:

main(i,4)

我得到了与问题描述相同的正确答案:

具有最大产品的1000位数字中的四个相邻数字是9×9×8×9 = 5832。

但是,在运行y = 13之后,输出为5377010688,这不是正确的答案。正确的答案应该是23514624000。

为什么我的程序返回y = 4的正确值,而y = 13?

我认为问题与您获取子字有关。您正在切一个多行字符串,因此您的某些切片将包含一个newline字符而不是数字。尽管您的乘法代码会忽略这些新线,但它们仍然很重要,因为它们会更改乘法中的实际数字数量。如果您要找到跨线边界的最大产品(对于大型y来说可能是可能的(,则您不会找到正确的产品,因为您只需要比问题所期望的少数数字。

我建议您在进行任何切片之前从数字字符串中删除新线。最简单的方法可能是i = i.replace('n', '')。(然后,您还可以删除逻辑以跳过mult函数的新线,尽管将其留入可能实际上并没有太大伤害。(

得到了它。您的输入是错误的。您将newline字符嵌入数字字符串中。尝试此初始化语法,而是:

i = 
'73167176531330624919225119674426574742355349194934' + 
'96983520312774506326239578318016984801869478851843' + 
'85861560789112949495459501737958331952853208805511' + 
'12540698747158523863050715693290963295227443043557' + 
'66896648950445244523161731856403098711121722383113' + 
'62229893423380308135336276614282806444486645238749' + 
'30358907296290491560440772390713810515859307960866' + 
'70172427121883998797908792274921901699720888093776' + 
'65727333001053367881220235421809751254540594752243' + 
'52584907711670556013604839586446706324415722155397' + 
'53697817977846174064955149290862569321978468622482' + 
'83972241375657056057490261407972968652414535100474' + 
'82166370484403199890008895243450658541227588666881' +  
'16427171479924442928230863465674813919123162824586' + 
'17866458359124566529476545682848912883142607690042' + 
'24219022671055626321111109370544217506941658960408' + 
'07198403850962455444362981230987879927244284909188' + 
'84580156166097919133875499200524063689912560717606' + 
'05886116467109405077541002256983155200055935729725' + 
'71636269561882670428252483600823257530420752963450'

随着这种更改,我将Len(i(为1000-在您发布的代码中,是1019,其中包括19个Newline字符。另外,我得到了正确的答案(几年前我解决了这个问题,并将代码保留为参考(。

相关内容

最新更新