首页 文章

项目Euler#8-查找数字中n个相邻数字的最大乘积 . 代码仅适用于n [闭合]的某些值

提问于
浏览
-4

我一直在使用Python中的Project Euler#8 . 任务是在这个非常长的数字中寻找13个相邻数字的最高乘积:

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 7163626956188267042825248360082 3257530420752963450

例如,前五位数的乘积是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.项目Euler没有给出任何提示 - 它只接受正确的答案或拒绝错误的答案 .

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

2 回答

  • 0

    得到它了 . 你的输入是错误的 . 您在数字字符串中嵌入了换行符 . 请尝试使用此初始化语法:

    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个换行符 . 另外,我得到了正确答案(几年前我解决了这个问题,并将代码作为参考) .

  • 0

    我认为问题与你有关're getting your substrings. You'切片多线字符串,因此你的一些切片将包含换行符而不是数字 . 虽然您的乘法代码会忽略这些换行符,但它们仍然很重要,因为它们会改变乘法中的实际位数 . 如果你试图找到的最大乘积跨越一个线边界(很可能是一个大的 y ),你赢了't find it correctly as you' ll只乘以比你想要的少一个数字 .

    我建议你在做任何切片之前从你的数字串中删除换行符 . 最简单的方法可能是 i = i.replace('\n', '') . (如果你愿意的话,你也可以删除逻辑以跳过 mult 函数的换行符,但实际上它可能并没有让它留下太多伤害 . )

相关问题