提问者:小点点

欧拉项目#8


我是python的新手,从Euler项目开始解决问题。 任务听起来是这样的-

'''1000位数中乘积最大的四个相邻数字是9×9×8×9=5832。

7316717653133062491922511967442657474235534919434 96983520312774506326239574235534919434 3257530420752963450

找出1000位数字中具有最大乘积的13个相邻数字。 这个产品的价值是什么? '''我试着自己解决这个问题,但我的答案和正确答案不一致。 可能是什么问题? (正确有效的解决方案我已经看了100遍了,我想明白我的代码做错了什么)

我的代码:

import numpy

number = '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'

numbers = list(number)
numberss = [int(i) for i in numbers] #making int list of this numbers

n = 0
total = []
while n <= 987:
    i = numberss[0+n:13+n] #i = list of 13 numbers that moves +1 rightwards
    isum = numpy.prod(i) # product of numbers in list i
    if isum > 0:
        total.append(isum)
    n += 1


sorted_total = sorted(total)
print(sorted_total[-1]) #the last and the biggest number in isum

共1个答案

匿名用户

快速代码审查:

number = '73167176531330...'

numbers = list(number)  # not necessary - strings are iterable
numberss = [int(i) for i in numbers] #making int list of this numbers

n = 0
# there is no need to even store this list - call max on a generator
total = []
while n <= 987:  # avoid using magic numbers; just use for loop instead
    # another magic number below
    i = numberss[0+n:13+n] #i = list of 13 numbers that moves +1 rightwards
    isum = numpy.prod(i) # product of numbers in list i
    if isum > 0:
        total.append(isum)
    n += 1

# we're looking for only one max value, no need to sort everything
sorted_total = sorted(total)
print(sorted_total[-1]) #the last and the biggest number in isum

修复注释后(但不修复算法):

seq_length = 13
numbers = [int(i) for i in number]
print(max(numpy.prod(numbers[i:i+seq_length]) for i in range(len(number) - seq_length))))

现在,算法出现了一个问题:它是O(len(number)*seq_length)。 我们可以把它做成O(len(数字))。 一旦我们有了seq_length数的乘积,下一个乘积只需一乘一除即可: