1. 程式人生 > >演算法設計之Project Euler 08:Largest product in a series

演算法設計之Project Euler 08:Largest product in a series

一、問題

Largest product in a series

The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832.

                              73167176531330624919225119674426574742355349194934                               96983520312774506326239578318016984801869478851843                               85861560789112949495459501737958331952853208805511                               12540698747158523863050715693290963295227443043557                               66896648950445244523161731856403098711121722383113                               62229893423380308135336276614282806444486645238749                               30358907296290491560440772390713810515859307960866                               70172427121883998797908792274921901699720888093776                               65727333001053367881220235421809751254540594752243                               52584907711670556013604839586446706324415722155397                               53697817977846174064955149290862569321978468622482                               83972241375657056057490261407972968652414535100474                               8216637048440319989

0008895243450658541227588666881                               16427171479924442928230863465674813919123162824586                               17866458359124566529476545682848912883142607690042                               24219022671055626321111109370544217506941658960408                               07198403850962455444362981230987879927244284909188                               84580156166097919133875499200524063689912560717606                               05886116467109405077541002256983155200055935729725                               71636269561882670428252483600823257530420752963450

Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?

二、問題描述

在1000個數字中,4個相連數字的最大乘積是9*9*8*9=5832,其位置如上標紅處所示。

那麼請找出13個相連數字的最大乘積。

答案為:23514624000

三、第一遍刷Project Euler

思路:將1000個數字以字串的形式讀取到記憶體中,然後逐個遍歷,並計算相鄰12個數的乘積。儲存最大的乘積即可。

python版本程式碼為:

digit_matrix = (
    "73167176531330624919225119674426574742355349194934"
    "96983520312774506326239578318016984801869478851843"
    "85861560789112949495459501737958331952853208805511"
    "12540698747158523863050715693290963295227443043557"
    "66896648950445244523161731856403098711121722383113"
    "62229893423380308135336276614282806444486645238749"
    "30358907296290491560440772390713810515859307960866"
    "70172427121883998797908792274921901699720888093776"
    "65727333001053367881220235421809751254540594752243"
    "52584907711670556013604839586446706324415722155397"
    "53697817977846174064955149290862569321978468622482"
    "83972241375657056057490261407972968652414535100474"
    "82166370484403199890008895243450658541227588666881"
    "16427171479924442928230863465674813919123162824586"
    "17866458359124566529476545682848912883142607690042"
    "24219022671055626321111109370544217506941658960408"
    "07198403850962455444362981230987879927244284909188"
    "84580156166097919133875499200524063689912560717606"
    "05886116467109405077541002256983155200055935729725"
    "71636269561882670428252483600823257530420752963450"
    )


def find_product(x):
    # 儲存最大乘積的變數
    product_max = 1
    for i in range(0, 1000-x):

        # 儲存相鄰x數的臨時變數
        product_x = 1
        for j in range(0, x+1):
            # 計算相鄰x個數的乘積,ord()是將字元轉換成數字,ASCII碼格式,數字的編號從48起,所以減去48
            product_x *= (ord(digit_matrix[i+j])-48)

        # 記錄最大的乘積
        if product_max < product_x:
            product_max = product_x

    print(product_max)

if __name__ == '__main__':
    find_product(12)        # 由於第一個數的編號是0,這裡13個數則輸入12