Maximum sum and product of the M consecutive digits in a number
Given a number in the form of a string. The task is to find the maximum sum and product of m consecutive digits that are taken from the number string.
Examples:
Input: N = 3675356291, m = 5
Output: 3150
There are 6 sequences of 5 digits 36753, 67535, 75356, 53562, 35629, 56291
6 x 7 x 5 x 3 x 5 gives the maximum product.
Input: N = 2709360626, m = 5
Output: 0
Since each sequence of consecutive 5 digits will contain a 0 so each time product will be zero so
the maximum product is zero.
Naive Approach:
- Take all possible consecutive sequences of m characters from the given string.
- Add them and Multiply them by changing the characters into integers.
- Compare the product and sum of each sequence and find the maximum product and sum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void maxProductSum(string str, int m)
{
int n = str.length();
int maxProd = INT_MIN, maxSum = INT_MIN;
for ( int i = 0; i <=n - m; i++) {
int product = 1, sum = 0;
for ( int j = i; j < m + i; j++) {
product = product * (str[j] - '0' );
sum = sum + (str[j] - '0' );
}
maxProd = max(maxProd, product);
maxSum = max(maxSum, sum);
}
cout << "Maximum Product = " << maxProd;
cout << "\nMaximum Sum = " << maxSum;
}
int main()
{
string str = "3605356297" ;
int m = 3;
maxProductSum(str, m);
}
|
Java
import java.io.*;
class GFG {
static void maxProductSum(String str, int m)
{
int n = str.length();
int maxProd = Integer.MIN_VALUE, maxSum = Integer.MIN_VALUE;
for ( int i = 0 ; i <=n - m; i++) {
int product = 1 , sum = 0 ;
for ( int j = i; j < m + i; j++) {
product = product * (str.charAt(j) - '0' );
sum = sum + (str.charAt(j) - '0' );
}
maxProd = Math.max(maxProd, product);
maxSum = Math.max(maxSum, sum);
}
System.out.println( "Maximum Product = " + maxProd);
System.out.print( "\nMaximum Sum = " + maxSum);
}
public static void main (String[] args) {
String str = "3605356297" ;
int m = 3 ;
maxProductSum(str, m);
}
}
|
Python 3
import sys
def maxProductSum(string, m) :
n = len (string)
maxProd , maxSum = ( - (sys.maxsize) - 1 ,
- (sys.maxsize) - 1 )
for i in range (n - m + 1 ) :
product, sum = 1 , 0
for j in range (i, m + i) :
product = product * ( ord (string[j]) -
ord ( '0' ))
sum = sum + ( ord (string[j]) -
ord ( '0' ))
maxProd = max (maxProd, product)
maxSum = max (maxSum, sum )
print ( "Maximum Product =" , maxProd)
print ( "Maximum sum =" , maxSum)
if __name__ = = "__main__" :
string = "3605356297"
m = 3
maxProductSum(string, m)
|
C#
using System;
class GFG
{
static void maxProductSum( string str, int m)
{
int n = str.Length;
int maxProd = int .MinValue,
maxSum = int .MinValue;
for ( int i = 0; i <= n - m; i++)
{
int product = 1, sum = 0;
for ( int j = i; j < m + i; j++)
{
product = product * (str[j] - '0' );
sum = sum + (str[j] - '0' );
}
maxProd = Math.Max(maxProd, product);
maxSum = Math.Max(maxSum, sum);
}
Console.WriteLine( "Maximum Product = " + maxProd);
Console.Write( "\nMaximum Sum = " + maxSum);
}
public static void Main ()
{
string str = "3605356297" ;
int m = 3;
maxProductSum(str, m);
}
}
|
PHP
<?php
function maxProductSum( $str , $m )
{
$n = strlen ( $str );
$maxProd = PHP_INT_MIN;
$maxSum = PHP_INT_MIN;
for ( $i = 0; $i <= ( $n - $m ); $i ++)
{
$product = 1;
$sum = 0;
for ( $j = $i ; $j < ( $m + $i ); $j ++)
{
$product = $product *
( $str [ $j ] - '0' );
$sum = $sum + ( $str [ $j ] - '0' );
}
$maxProd = max( $maxProd , $product );
$maxSum = max( $maxSum , $sum );
}
echo "Maximum Product = " , $maxProd ;
echo "\nMaximum Sum = " , $maxSum ;
}
$str = "3605356297" ;
$m = 3;
maxProductSum( $str , $m );
?>
|
Javascript
<script>
function maxProductSum(str, m)
{
let n = str.length;
let maxProd = Number.MIN_VALUE,
maxSum = Number.MIN_VALUE;
for (let i = 0; i <= n - m; i++)
{
let product = 1, sum = 0;
for (let j = i; j < m + i; j++)
{
product = product * (str[j] - '0' );
sum = sum + (str[j] - '0' );
}
maxProd = Math.max(maxProd, product);
maxSum = Math.max(maxSum, sum);
}
document.write( "Maximum Product = " + maxProd + "</br>" );
document.write( "Maximum Sum = " + maxSum);
}
let str = "3605356297" ;
let m = 3;
maxProductSum(str, m);
</script>
|
Output
Maximum Product = 126
Maximum Sum = 18
Efficient Approach: The idea is to use the Sliding Window concept . First, find the sum and product of M consecutive digits and update the maxProd and maxSum.
Then start traversing from Mth index and add current digit to the sum and subtract str[i-M] from the sum i.e. considering only M elements/digits. Similarly for the product. And keep updating the maxSum and maxProd.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void maxProductSum(string str, int m)
{
int n = str.length();
int product = 1, sum = 0, ZeroesInWindow=0;
for ( int i = 0; i < m; i++) {
sum += (str[i] - '0' );
if (str[i]!= '0' )
product *= (str[i] - '0' );
else
ZeroesInWindow++;
}
int maxProd = 0;
if (ZeroesInWindow==0)
maxProd = product;
int maxSum = sum;
for ( int i = m; i < n; i++) {
if (str[i]!= '0' && str[i-m]!= '0' )
product = product * (str[i] - '0' ) / ((str[i - m]) - '0' );
else if (str[i]!= '0' && str[i-m]== '0' )
{
product = product * (str[i] - '0' );
ZeroesInWindow--;
}
else if (str[i]== '0' && str[i-m]!= '0' )
{
product = product / (str[i-m] - '0' );
ZeroesInWindow++;
}
if (ZeroesInWindow==0)
maxProd = max(maxProd, product);
sum = sum + (str[i] - '0' ) - ((str[i - m]) - '0' );
maxSum = max(maxSum, sum);
}
cout << "Maximum Product = " << maxProd;
cout << "\nMaximum Sum = " << maxSum;
}
int main()
{
string str = "3601990545" ;
int m = 3;
maxProductSum(str, m);
}
|
Java
import java.util.Arrays;
import java.io.*;
class GFG {
static void maxProductSum(String str, int m)
{
int n = str.length();
int product = 1 , sum = 0 , ZeroesInWindow= 0 ;
for ( int i = 0 ; i < m; i++)
{
sum += (str.charAt(i) - '0' );
if (str.charAt(i)!= '0' )
product *= (str.charAt(i) - '0' );
else
ZeroesInWindow++;
}
int maxProd = 0 ;
if (ZeroesInWindow== 0 )
maxProd = product;
int maxSum = sum;
for ( int i = m; i < n; i++)
{
if (str.charAt(i)!= '0' && str.charAt(i-m)!= '0' )
product = product * (str.charAt(i) - '0' ) / ((str.charAt(i-m)) - '0' );
else if (str.charAt(i)!= '0' && str.charAt(i-m)== '0' )
{
product = product * (str.charAt(i) - '0' );
ZeroesInWindow--;
}
else if (str.charAt(i)== '0' && str.charAt(i-m)!= '0' )
{
product = product / (str.charAt(i-m) - '0' );
ZeroesInWindow++;
}
if (ZeroesInWindow== 0 )
maxProd = Math.max(maxProd, product);
sum = sum + (str.charAt(i) - '0' ) - ((str.charAt(i-m)) - '0' );
maxSum = Math.max(maxSum, sum);
}
System.out.println( "Maximum Product = " + maxProd);
System.out.println( "\nMaximum Sum = " + maxSum);
}
public static void main (String[] args) {
String str = "3601990545" ;
int m = 3 ;
maxProductSum(str, m);
}
}
|
Python 3
def maxProductSum( str , m):
n = len ( str )
product = 1
sum = 0
for i in range (m):
sum + = ( ord ( str [i]) - ord ( '0' ))
product * = ( ord ( str [i]) - ord ( '0' ))
maxProd = product
maxSum = sum
for i in range (m, n) :
product = (product * ( ord ( str [i]) - ord ( '0' )) / /
(( ord ( str [i - m])) - ord ( '0' )))
sum = ( sum + ( ord ( str [i]) - ord ( '0' )) -
(( ord ( str [i - m])) - ord ( '0' )))
maxProd = max (maxProd, product)
maxSum = max (maxSum, sum )
print ( "Maximum Product =" , maxProd)
print ( "Maximum Sum =" , maxSum)
if __name__ = = "__main__" :
str = "3675356291"
m = 5
maxProductSum( str , m)
|
C#
using System;
class GFG
{
static void maxProductSum( string str, int m)
{
int n = str.Length;
int product = 1, sum = 0;
for ( int i = 0; i < m; i++)
{
sum += (str[i] - '0' );
product *= (str[i] - '0' );
}
int maxProd = product;
int maxSum = sum;
for ( int i = m; i < n; i++)
{
product = product * (str[i] - '0' ) / ((str[i - m]) - '0' );
sum = sum + (str[i] - '0' ) - ((str[i - m]) - '0' );
maxProd = Math.Max(maxProd, product);
maxSum = Math.Max(maxSum, sum);
}
Console.Write( "Maximum Product = " + maxProd);
Console.Write( "\nMaximum Sum = " + maxSum);
}
public static void Main()
{
string str = "3675356291" ;
int m = 5;
maxProductSum(str, m);
}
}
|
PHP
<?php
function maxProductSum( $str , $m )
{
$n = strlen ( $str );
$product = 1;
$sum = 0;
for ( $i = 0; $i < $m ; $i ++)
{
$sum += ( $str [ $i ] - '0' );
$product *= ( $str [ $i ] - '0' );
}
$maxProd = $product ;
$maxSum = $sum ;
for ( $i = $m ; $i < $n ; $i ++)
{
$product = $product * ( $str [ $i ] - '0' ) /
(( $str [ $i - $m ]) - '0' );
$sum = $sum + ( $str [ $i ] - '0' ) -
(( $str [ $i - $m ]) - '0' );
$maxProd = max( $maxProd , $product );
$maxSum = max( $maxSum , $sum );
}
echo "Maximum Product = " , $maxProd ;
echo "\nMaximum Sum = " , $maxSum ;
}
$str = "3675356291" ;
$m = 5;
maxProductSum( $str , $m );
?>
|
Javascript
<script>
function maxProductSum(str, m)
{
let n = str.length;
let product = 1, sum = 0;
for (let i = 0; i < m; i++)
{
sum += (str[i].charCodeAt() - '0' .charCodeAt());
product *= (str[i].charCodeAt() - '0' .charCodeAt());
}
let maxProd = product;
let maxSum = sum;
for (let i = m; i < n; i++)
{
product = product * (str[i].charCodeAt() - '0' .charCodeAt()) / ((str[i - m].charCodeAt()) - '0' .charCodeAt());
sum = sum + (str[i].charCodeAt() - '0' .charCodeAt()) - ((str[i - m].charCodeAt()) - '0' .charCodeAt());
maxProd = Math.max(maxProd, product);
maxSum = Math.max(maxSum, sum);
}
document.write( "Maximum Product = " + maxProd + "</br>" );
document.write( "Maximum Sum = " + maxSum);
}
let str = "3675356291" ;
let m = 5;
maxProductSum(str, m);
</script>
|
Output
Maximum Product = 100
Maximum Sum = 19
Last Updated :
09 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...