Square of large number represented as String
Last Updated :
24 Nov, 2022
Given a very large number, the task is to write a program to compute its square.
Examples:
Input: 9999
Output: 99980001
9999*9999 = 99980001
Input: 45454545
Output: 2066115661157025
45454545*45454545 = 2066115661157025
Naive Approach: A naive approach is to calculate the squares my multiplying the number with itself. But in C++, if the input is a large number, the resultant square will overflow.
Efficient Approach: An efficient approach is to store the number as strings, and perform multiplication of two large numbers.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
string multiply(string num1, string num2)
{
int n1 = num1.size();
int n2 = num2.size();
if (n1 == 0 || n2 == 0)
return "0" ;
vector< int > result(n1 + n2, 0);
int i_n1 = 0;
int i_n2 = 0;
for ( int i = n1 - 1; i >= 0; i--) {
int carry = 0;
int n1 = num1[i] - '0' ;
i_n2 = 0;
for ( int j = n2 - 1; j >= 0; j--) {
int n2 = num2[j] - '0' ;
int sum = n1 * n2 + result[i_n1 + i_n2] + carry;
carry = sum / 10;
result[i_n1 + i_n2] = sum % 10;
i_n2++;
}
if (carry > 0)
result[i_n1 + i_n2] += carry;
i_n1++;
}
int i = result.size() - 1;
while (i >= 0 && result[i] == 0)
i--;
if (i == -1)
return "0" ;
string s = "" ;
while (i >= 0)
s += std::to_string(result[i--]);
return s;
}
int main()
{
string str1 = "454545454545454545" ;
cout << multiply(str1, str1);
return 0;
}
|
Java
class GFG
{
public static String multiply(String num1, String num2)
{
int n1 = num1.length();
int n2 = num2.length();
if (n1 == 0 || n2 == 0 )
return "0" ;
int [] result = new int [n1 + n2];
int i_n1 = 0 ;
int i_n2 = 0 ;
for ( int i = n1 - 1 ; i >= 0 ; i--)
{
int carry = 0 ;
int n_1 = num1.charAt(i) - '0' ;
i_n2 = 0 ;
for ( int j = n2 - 1 ; j >= 0 ; j--)
{
int n_2 = num2.charAt(j) - '0' ;
int sum = n_1 * n_2 + result[i_n1 + i_n2] + carry;
carry = sum / 10 ;
result[i_n1 + i_n2] = sum % 10 ;
i_n2++;
}
if (carry > 0 )
result[i_n1 + i_n2] += carry;
i_n1++;
}
int i = result.length - 1 ;
while (i >= 0 && result[i] == 0 )
i--;
if (i == - 1 )
return "0" ;
String s = "" ;
while (i >= 0 )
s += Integer.toString(result[i--]);
return s;
}
public static void main(String[] args)
{
String str1 = "454545454545454545" ;
System.out.println(multiply(str1, str1));
}
}
|
Python3
def multiply(num1, num2):
n1 = len (num1)
n2 = len (num2)
if (n1 = = 0 or n2 = = 0 ):
return "0"
result = [ 0 ] * (n1 + n2)
i_n1 = 0
i_n2 = 0
for i in range (n1 - 1 , - 1 , - 1 ):
carry = 0
n_1 = ord (num1[i]) - ord ( '0' )
i_n2 = 0
for j in range (n2 - 1 , - 1 , - 1 ):
n_2 = ord (num2[j]) - ord ( '0' )
sum = n_1 * n_2 + result[i_n1 + i_n2] + carry
carry = sum / / 10
result[i_n1 + i_n2] = sum % 10
i_n2 + = 1
if (carry > 0 ):
result[i_n1 + i_n2] + = carry
i_n1 + = 1
i = len (result) - 1
while (i > = 0 and result[i] = = 0 ):
i - = 1
if (i = = - 1 ):
return "0"
s = ""
while (i > = 0 ):
s + = str (result[i])
i - = 1
return s
if __name__ = = "__main__" :
str1 = "454545454545454545"
print (multiply(str1, str1))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
public static String multiply(String num1,
String num2)
{
int n1 = num1.Length;
int n2 = num2.Length;
if (n1 == 0 || n2 == 0)
return "0" ;
int [] result = new int [n1 + n2];
int i_n1 = 0;
int i_n2 = 0;
int i = 0;
for (i = n1 - 1; i >= 0; i--)
{
int carry = 0;
int n_1 = num1[i] - '0' ;
i_n2 = 0;
for ( int j = n2 - 1; j >= 0; j--)
{
int n_2 = num2[j] - '0' ;
int sum = n_1 * n_2 +
result[i_n1 + i_n2] + carry;
carry = sum / 10;
result[i_n1 + i_n2] = sum % 10;
i_n2++;
}
if (carry > 0)
result[i_n1 + i_n2] += carry;
i_n1++;
}
i = result.Length - 1;
while (i >= 0 && result[i] == 0)
i--;
if (i == -1)
return "0" ;
String s = "" ;
while (i >= 0)
s += (result[i--]).ToString();
return s;
}
public static void Main(String[] args)
{
String str1 = "454545454545454545" ;
Console.WriteLine(multiply(str1, str1));
}
}
|
Javascript
<script>
function multiply(num1,num2)
{
let n1 = num1.length;
let n2 = num2.length;
if (n1 == 0 || n2 == 0)
return "0" ;
let result = new Array(n1 + n2);
for (let i=0;i<result.length;i++)
{
result[i]=0;
}
let i_n1 = 0;
let i_n2 = 0;
for (let i = n1 - 1; i >= 0; i--)
{
let carry = 0;
let n_1 = num1[i].charCodeAt(0) - '0' .charCodeAt(0);
i_n2 = 0;
for (let j = n2 - 1; j >= 0; j--)
{
let n_2 = num2[j].charCodeAt(0) - '0' .charCodeAt(0);
let sum = n_1 * n_2 + result[i_n1 + i_n2] + carry;
carry = Math.floor(sum / 10);
result[i_n1 + i_n2] = sum % 10;
i_n2++;
}
if (carry > 0)
result[i_n1 + i_n2] += carry;
i_n1++;
}
let i = result.length - 1;
while (i >= 0 && result[i] == 0)
i--;
if (i == -1)
return "0" ;
let s = "" ;
while (i >= 0)
s += (result[i--]).toString();
return s;
}
let str1 = "454545454545454545" ;
document.write(multiply(str1, str1));
</script>
|
Output
206611570247933883884297520661157025
Time Complexity: O(n2), where n is the size of the given string.
Auxiliary Space: O(n), where n is the size of the given string.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...