Euler Problem 8: Largest product in a series

Oct 28, 2017 14:42 · 432 words · 3 minutes read R Python Project_Euler

Mathedemo

Euler Problem 8

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

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 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?


Solution

Solution in R

I passed the 1000-digit number as a string to variable big_number. Then I remove all \n and split it into each integer.

big_number <- c("
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450")

big_number <- gsub("\n", "", big_number)  # Remove newlines
big_number <- as.integer(strsplit(big_number, "")[[1]])  # Return a list of integers

I created a function max_prod() to find product of n adjacent numbers in big_number, giving users to select the starting and ending points.

max_prod <- function(n = 1, m = 4, k = big_number) {
  max_product <- 0
  
  while (m <= 1000) {  # Loop through all digits in big_number
    new_product <- prod(k[n:m])
    
    if (new_product >= max_product) {  # Replace max_product, max_n and max_m if new product > previous max_product
      max_product <- new_product
      max_n <- n
      max_m <- m
    }
    
    n <- n + 1  # Move to right by 1 unit
    m <- m + 1
  }
  
  return(c(k[max_n:max_m], "product is", max_product))  # Return max_product and its elements
}

max_prod()  # Test default parameters if matches example
## [1] "9"          "9"          "8"          "9"          "product is"
## [6] "5832"
max_prod(m = 13)  # Answer to the question
##  [1] "5"           "5"           "7"           "6"           "6"          
##  [6] "8"           "9"           "6"           "6"           "4"          
## [11] "8"           "9"           "5"           "product is"  "23514624000"

Solution in Python

from numpy import prod

big_number = '''
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
'''
big_number = big_number.replace("\n", "")  # Remove newlines
big_number = list(map(int, big_number))  # Return a list of integers


def max_prod(n=1, m=4, k=big_number):
    max_product = 0

    while m <= 1000:  # Loop through all digits in big_number
        new_product = prod(k[n:(m + 1)])

        if new_product >= max_product:  # Replace max_product, max_n and max_m if new product > previous max_product
            max_product = new_product
            max_n = n
            max_m = m

        n += 1  # Move to right by 1 unit
        m += 1

    return(k[max_n:(max_m + 1)], max_product)  # Return max_product and its elements


max_prod()  # Test default parameters if matches example
max_prod(m = 13)  # Answer to the question