Euler Problem 8: Largest product in a series
Oct 28, 2017 14:42 · 432 words · 3 minutes read
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