4
'''
Find the greatest product of five consecutive digits in the 1000-digit number
'''

import time

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

biggest = 0
i = 1
while i < len(num):
    one = int(num[i]) 
    two = int(num[i+1])  
    thr = int(num[i+2]) 
    fou = int(num[i+3])
    fiv = int(num[i+4])
    product = one*two*thr*fou*fiv
    if product > biggest:
        biggest = product
    i += i+1 
 print(product)

 start = time.time()
 elapsed = (time.time() - start)
 print("This code took: " + str(elapsed) + " seconds")

这段代码给了我一个 7054 的答案,太低了,应该计算很多产品,但只计算其中的 9 个。我的问题是:是什么导致我的代码偏离其预期目的,以及如何优化计算“一”、“二”等的代码部分以计算产品?感谢您的任何建议!

4

9 回答 9

11

有几个问题。

  1. product你没有打印biggest。确保打印正确的变量!

  2. 当您实际上应该只在范围内进行迭代时,您正在迭代整个字符串的长度,[0..len(num) - 4)以便在进行产品计算时不会得到 IndexError。

  3. 您错误地增加了 i 变量。您想每转将其增加 1,因此只需执行i += 1i = i + 1。该代码i += i + 1相当于i = i + i + 1. 我认为您不想i在 while 循环的每次迭代中加倍。:)

  4. 序列在 Python 中是 0 索引的。这意味着当您遍历一组索引时,第一个元素总是在seq[0]并且元素继续直到seq[n-1]。因此,您应该从i0 而不是 1 开始变量!

  5. 你没有正确测量你的时间。您希望start在所有代码执行之前分配您的时间,以便您可以正确测量elapsed时间。

这是您的固定代码:

'''
Find the greatest product of five consecutive digits in the 1000-digit number
'''

import time
start = time.time()

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

biggest = 0
i = 0
while i < len(num) - 4:
    one = int(num[i]) 
    two = int(num[i+1])  
    thr = int(num[i+2]) 
    fou = int(num[i+3])
    fiv = int(num[i+4])
    product = one*two*thr*fou*fiv
    if product > biggest:
        biggest = product
    i = i + 1 
print(biggest)

elapsed = (time.time() - start)
print("This code took: " + str(elapsed) + " seconds")
于 2013-10-10T00:47:39.657 回答
3

你的问题在这里:

i += i+1

您浏览列表的速度太快了。你应该做这个:

i += 1

我会这样写代码:

import operator

# Return the product of all the digits in `series` converted to integers
def numprod(series):
    # Convert the series of digits into a list of integers
    digits = [int(c) for c in series]

    # This applies the multiplication operator to all the digits,
    # starting with 1
    return reduce(operator.__mul__, digits, 1)

# Produce every string of length 5
# This uses a generator but could just as easily use a list comprehension:
# numiter = [num[i : i + SERIES_SIZE] for i in range(len(num) - SERIES_SIZE + 1)]
SERIES_SIZE = 5
numiter = (num[i : i + SERIES_SIZE] for i in range(len(num) - SERIES_SIZE + 1))

# Calculate all the products
allnumprods = [numprod(series) for series in numiter]

# Find the maximum of all the products
print max(allnumprods)

计算产品的一种更简单的方法是:

def numprod(series):
    product = 1
    for c in series:
        product *= int(c)
    return product
于 2013-10-10T00:46:12.257 回答
1

还可以使用函数式编程来大大简化问题:

def foo():
    max_product = 0
    num = "string of input number"
    for e,n in enumerate(num):
        product = reduce((lambda x,y: x*y),map(int,(num[e:e+13])))
        if product > max_product: 
            max_product = product
    return max_product

试试看!

于 2017-04-06T13:59:50.953 回答
0

问题在这里:

i += i+1

i你每次都加倍并增加1它。因此,如果i是 1,则为 3。如果为 3,则为 7。如果为 7,则为 15,依此类推。但这意味着您的索引缺少很多地方,不是吗!

它导致您跳过数字中的许多位置。你想使用:

i += 1

这只是意味着将 1 添加到i.

或者你可以这样做:

i = i+1

这意味着,设置i等于i+1

于 2013-10-10T00:41:37.227 回答
0
import string
numbers=list()
fo=open("C:/python34/libs/maths2.txt","r+")
for eachline in fo:
    for char in eachline:
        if char.isdigit():
            A=char
            numbers.append(int(A))

print(numbers)
list1=list()
for i in range(0,len(numbers)-4):
    x=numbers[i]*numbers[i+1]*numbers[i+2]*numbers[i+3]*numbers[i+4]
    list1.append([x])
print(list1)
print(max(list1))
于 2015-06-17T06:30:41.570 回答
0

单线:

from functools import reduce
def max_prod(x):
    return max([reduce(lambda x, y: int(x) * int(y), (x[i:i+5])) for i in range(len(x)-5)])
于 2020-07-16T18:28:43.807 回答
0

再次,这没有优化,但它适用于 13 位数

import time
start_time = time.time()
num = "73167176531330624919225119674426574742355349194934\
96983520312774506326239578318016984801869478851843\
85861560789112949495459501737958331952853208805511\
12540698747158523863050715693290963295227443043557\
66896648950445244523161731856403098711121722383113\
62229893423380308135336276614282806444486645238749\
30358907296290491560440772390713810515859307960866\
70172427121883998797908792274921901699720888093776\
65727333001053367881220235421809751254540594752243\
52584907711670556013604839586446706324415722155397\
53697817977846174064955149290862569321978468622482\
83972241375657056057490261407972968652414535100474\
82166370484403199890008895243450658541227588666881\
16427171479924442928230863465674813919123162824586\
17866458359124566529476545682848912883142607690042\
24219022671055626321111109370544217506941658960408\
07198403850962455444362981230987879927244284909188\
84580156166097919133875499200524063689912560717606\
05886116467109405077541002256983155200055935729725\
71636269561882670428252483600823257530420752963450"
i = 0
j = 0
k = 0
while i < len(num) - 13:
    one = int(num[i])
    two = int(num[i + 1])
    three = int(num[i + 2])
    four = int(num[i + 3])
    five = int(num[i + 4])
    six = int(num[i + 5])
    seven = int(num[i + 6])
    eight = int(num[i + 7])
    nine = int(num[i + 8])
    ten = int(num[i + 9])
    eleven = int(num[i + 10])
    twoelve = int(num[i + 11])
    thirteen = int(num[i + 12])
    j = one * two * three * four * five * six * seven * eight * nine * ten * eleven * twoelve * thirteen
    i = i + 1
    if k < j:
        k = j
print(k)
print(time.time() - start_time," seconds")
于 2018-06-19T10:20:39.387 回答
0

我的解决方案

s = '''7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'''


t = list(s)
#len(t) = 1000
#t[::-1] = t[999]

r = []
q = 0
while q <= 999:
    w = int(t[q])
    r.append(w)
    q += 1

a = 0
b = 1
c = 2
d = 3
e = 4
f = 5
g = 6
h = 7
i = 8
j = 9
k = 10
l = 11
m = 12

y = []

while m<=999:
    n = r[a]*r[b]*r[c]*r[d]*r[e]*r[f]*r[g]*r[h]*r[i]*r[j]*r[k]*r[l]*r[m]
    y.append(n)
    a += 1
    b += 1
    c += 1
    d+= 1
    e+= 1
    f+= 1
    g+= 1
    h+= 1
    i+= 1
    j+= 1
    l+= 1
    k+= 1
    m+= 1
    if m >= 1000:
        break

print(y)
print(max(y))
于 2020-07-16T18:01:21.713 回答
0
# 8 Largest product in a series

from functools import reduce

the_num = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"

the_num_lst = []
for n in the_num:
    the_num_lst.append(int(n))

x = 0
y = reduce((lambda a, b: a * b), the_num_lst[x:x + 13])
while x < 1000 - 13:
    x += 1
    z = reduce((lambda a, b: a * b), the_num_lst[x:x + 13])
    if z > y:
        y = z
print(y)
于 2020-05-20T13:55:41.077 回答