Given string str having N characters representing an integer, the task is to calculate the sum of all possible prefixes of the given string.
Example:
Input: str = “1225”
Output: 1360
Explanation: The prefixes of the given string are 1, 12, 122, and 1225 and their sum will be 1 + 12 + 122 + 1225 = 1360.Input: str = “20”
Output: 22
Approach: The given problem is an implementation-based problem and can be solved by iterating over all the prefixes of the string and maintaining their sum in a string. The sum of two integers represented as strings can be done using the approach discussed here.
Below is the implementation of the above approach:
// C++ program of the above approach #include <bits/stdc++.h> using namespace std;
// Function for finding sum of larger numbers string findSum(string str1, string str2) { // Before proceeding further, make
// sure length of str2 is larger
if (str1.length() > str2.length())
swap(str1, str2);
// Stores resulting sum
string str = "" ;
// Calculate length of both string
int n1 = str1.length(), n2 = str2.length();
// Reverse both of strings
reverse(str1.begin(), str1.end());
reverse(str2.begin(), str2.end());
int carry = 0;
for ( int i = 0; i < n1; i++) {
// Compute sum of current
// digits and carry
int sum
= ((str1[i] - '0' )
+ (str2[i] - '0' )
+ carry);
str.push_back(sum % 10 + '0' );
// Carry for next step
carry = sum / 10;
}
// Add remaining digits
for ( int i = n1; i < n2; i++) {
int sum = ((str2[i] - '0' ) + carry);
str.push_back(sum % 10 + '0' );
carry = sum / 10;
}
// Add remaining carry
if (carry)
str.push_back(carry + '0' );
// Reverse string
reverse(str.begin(), str.end());
// Return Answer
return str;
} // Function to find sum of all prefixes // of a string representing a number string sumPrefix(string str) { // Stores the desired sum
string sum = "0" ;
// Stores the current prefix
string curPre = "" ;
// Loop to iterate str
for ( int i = 0; i < str.length(); i++) {
// Update current prefix
curPre += str[i];
// Update Sum
sum = findSum(curPre, sum);
}
// Return Answer
return sum;
} // Driver Code int main()
{ string str = "1225" ;
cout << sumPrefix(str);
return 0;
} |
// Java program of the above approach import java.util.*;
class GFG{
// Function for finding sum of larger numbers static String findSum(String str1, String str2)
{ // Before proceeding further, make
// sure length of str2 is larger
if (str1.length() > str2.length()) {
String s = str1;
str1=str2;
str2=s;
}
// Stores resulting sum
String str = "" ;
// Calculate length of both String
int n1 = str1.length(), n2 = str2.length();
// Reverse both of Strings
str1 = reverse(str1);
str2 = reverse(str2);
int carry = 0 ;
for ( int i = 0 ; i < n1; i++) {
// Compute sum of current
// digits and carry
int sum
= ((str1.charAt(i) - '0' )
+ (str2.charAt(i) - '0' )
+ carry);
str+=( char )((sum % 10 + '0' ));
// Carry for next step
carry = sum / 10 ;
}
// Add remaining digits
for ( int i = n1; i < n2; i++) {
int sum = ((str2.charAt(i) - '0' ) + carry);
str+=( char )(sum % 10 + '0' );
carry = sum / 10 ;
}
// Add remaining carry
if (carry > 0 )
str += (carry + '0' );
// Reverse String
str = reverse(str);
// Return Answer
return str;
} // Function to find sum of all prefixes // of a String representing a number static String sumPrefix(String str)
{ // Stores the desired sum
String sum = "0" ;
// Stores the current prefix
String curPre = "" ;
// Loop to iterate str
for ( int i = 0 ; i < str.length(); i++)
{
// Update current prefix
curPre += ( char )(str.charAt(i));
// Update Sum
sum = findSum(curPre, sum);
}
// Return Answer
return sum;
} static String reverse(String input) {
char [] a = input.toCharArray();
int l, r = a.length - 1 ;
for (l = 0 ; l < r; l++, r--) {
char temp = a[l];
a[l] = a[r];
a[r] = temp;
}
return String.valueOf(a);
} // Driver Code public static void main(String[] args)
{ String str = "1225" ;
System.out.print(sumPrefix(str));
} } // This code is contributed by shikhasingrajput |
# Python code for the above approach # Function for finding sum of larger numbers def findSum(str1, str2):
# Before proceeding further, make
# sure length of str2 is larger
if ( len (str1) > len (str2)):
temp = str1;
str1 = str2;
str2 = temp;
# Stores resulting sum
str = [];
# Calculate length of both string
n1 = len (str1)
n2 = len (str2)
# Reverse both of strings
str1 = list (str1)
str2 = list (str2)
str1.reverse();
str2.reverse();
carry = 0 ;
for i in range (n1):
# Compute sum of current
# digits and carry
sum = (( ord (str1[i]) - ord ( '0' )) + ( ord (str2[i]) - ord ( '0' )) + carry);
str .append( chr ( sum % 10 + ord ( '0' )));
# Carry for next step
carry = sum / / 10
# Add remaining digits
for i in range (n1, n2):
sum = (( ord (str2[i]) - ord ( '0' )) + carry);
str .append( chr ( sum % 10 + ord ( '0' )));
carry = sum / / 10
# Add remaining carry
if (carry):
str .append( chr (carry + ord ( '0' )));
# Reverse string
str .reverse();
# Return Answer
return ''.join( str )
# Function to find sum of all prefixes # of a string representing a number def sumPrefix( str ):
# Stores the desired sum
sum = "0" ;
# Stores the current prefix
curPre = "";
# Loop to iterate str
for i in range ( len ( str )):
# Update current prefix
curPre + = str [i];
# Update Sum
sum = findSum(curPre, sum );
# Return Answer
return sum ;
# Driver Code str = "1225" ;
print (sumPrefix( str ));
# This code is contributed by Saurabh Jaiswal |
// C# program of the above approach using System;
public class GFG{
// Function for finding sum of larger numbers static String findSum(String str1, String str2)
{ // Before proceeding further, make
// sure length of str2 is larger
if (str1.Length > str2.Length) {
String s = str1;
str1=str2;
str2=s;
}
// Stores resulting sum
String str = "" ;
// Calculate length of both String
int n1 = str1.Length, n2 = str2.Length;
// Reverse both of Strings
str1 = reverse(str1);
str2 = reverse(str2);
int carry = 0;
for ( int i = 0; i < n1; i++)
{
// Compute sum of current
// digits and carry
int sum
= ((str1[i] - '0' )
+ (str2[i] - '0' )
+ carry);
str+=( char )((sum % 10 + '0' ));
// Carry for next step
carry = sum / 10;
}
// Add remaining digits
for ( int i = n1; i < n2; i++) {
int sum = ((str2[i] - '0' ) + carry);
str+=( char )(sum % 10 + '0' );
carry = sum / 10;
}
// Add remaining carry
if (carry > 0)
str += (carry + '0' );
// Reverse String
str = reverse(str);
// Return Answer
return str;
} // Function to find sum of all prefixes // of a String representing a number static String sumPrefix(String str)
{ // Stores the desired sum
String sum = "0" ;
// Stores the current prefix
String curPre = "" ;
// Loop to iterate str
for ( int i = 0; i < str.Length; i++)
{
// Update current prefix
curPre += ( char )(str[i]);
// Update Sum
sum = findSum(curPre, sum);
}
// Return Answer
return sum;
} static String reverse(String input) {
char [] a = input.ToCharArray();
int l, r = a.Length - 1;
for (l = 0; l < r; l++, r--) {
char temp = a[l];
a[l] = a[r];
a[r] = temp;
}
return String.Join( "" ,a);
} // Driver Code public static void Main(String[] args)
{ String str = "1225" ;
Console.Write(sumPrefix(str));
} } // This code is contributed by 29AjayKumar |
<script> // JavaScript code for the above approach
// Function for finding sum of larger numbers
function findSum(str1, str2)
{
// Before proceeding further, make
// sure length of str2 is larger
if (str1.length > str2.length) {
let temp = str1;
str1 = str2;
str2 = temp;
}
// Stores resulting sum
let str = [];
// Calculate length of both string
let n1 = str1.length, n2 = str2.length;
// Reverse both of strings
str1 = str1.split( '' )
str2 = str2.split( '' )
str1.reverse();
str2.reverse();
let carry = 0;
for (let i = 0; i < n1; i++) {
// Compute sum of current
// digits and carry
let sum
= ((str1[i].charCodeAt(0) - '0' .charCodeAt(0))
+ (str2[i].charCodeAt(0) - '0' .charCodeAt(0))
+ carry);
str.push(String.fromCharCode(sum % 10 + '0' .charCodeAt(0)));
// Carry for next step
carry = Math.floor(sum / 10);
}
// Add remaining digits
for (let i = n1; i < n2; i++) {
let sum = ((str2[i].charCodeAt(0) - '0' .charCodeAt(0)) + carry);
str.push(String.fromCharCode(sum % 10 + '0' .charCodeAt(0)));
carry = Math.floor(sum / 10);
}
// Add remaining carry
if (carry)
str.push(String.fromCharCode(carry + '0' .charCodeAt(0)));
// Reverse string
str.reverse();
// Return Answer
return str.join( '' );
}
// Function to find sum of all prefixes
// of a string representing a number
function sumPrefix(str)
{
// Stores the desired sum
let sum = "0" ;
// Stores the current prefix
let curPre = "" ;
// Loop to iterate str
for (let i = 0; i < str.length; i++) {
// Update current prefix
curPre += str[i];
// Update Sum
sum = findSum(curPre, sum);
}
// Return Answer
return sum;
}
// Driver Code
let str = "1225" ;
document.write(sumPrefix(str));
// This code is contributed by Potta Lokesh
</script>
|
1360
Time Complexity: O(N2)
Auxiliary Space: O(N)