Category: Number Theory
Algorithm:
- Create two arrays, multiply_dig and add, both of size maxPosition, where maxPosition is calculated as (num1.length() * num2.length()) + 1.
- Initialize each element in add to 0.
- Use nested loops to iterate through each digit of num2 (outer loop) and num1 (inner loop).
- Calculate the product of the current digits from num1 and num2, considering any carry from the previous digit.
- Update the multiply_dig array with the calculated values.
- After each inner loop (i.e., after processing one digit of num2), add the intermediate results stored in multiply_dig to the add array.
- Handle any carry during addition.
- Traverse the add array from the beginning.
- Ignore leading zeros until a non-zero digit is encountered.
- Concatenate the non-zero digits to the answer string.
- If the answer string is empty (all zeros), return "0".
- Otherwise, return the calculated result.
Code(C++)
#include <iostream>
#include <string>
using namespace std;
string multiplyStrings(string num1, string num2) {
int maxPosition = (num1.length() * num2.length()) + 1;
int add[maxPosition] = {0}; // Using an array instead of dynamic allocation
string result = "";
for (int i = num2.length() - 1; i >= 0; i--) {
int carry = 0;
int position = maxPosition - (num2.length() - i);
for (int j = num1.length() - 1; j >= 0; j--) {
int value = ((num1[j] - '0') * (num2[i] - '0')) + carry + add[position];
add[position] = value % 10;
carry = value / 10;
position--;
}
while (carry != 0) {
int value = add[position] + carry;
add[position] = value % 10;
carry = value / 10;
position--;
}
}
bool flag = false;
for (int i = 0; i < maxPosition; i++) {
if (add[i] == 0 && !flag)
continue;
else {
result += static_cast<char>(add[i] + '0');
flag = true;
}
}
if (result.empty())
result = "0";
return result;
}
int main() {
string num1 = "123";
string num2 = "456";
string result = multiplyStrings(num1, num2);
cout << "Result: " << result << endl;
return 0;
}
Code(C#)
using System;
namespace MultiplicationApp
{
class Solution
{
static string MultiplyStrings(string num1, string num2)
{
int maxPosition = (num1.Length * num2.Length) + 1;
int[] add = new int[maxPosition];
string result = "";
for (int i = 0; i < maxPosition; i++)
add[i] = 0;
for (int i = num2.Length - 1; i >= 0; i--)
{
int carry = 0;
int position = maxPosition - (num2.Length - i);
for (int j = num1.Length - 1; j >= 0; j--)
{
int value = ((num1[j] - '0') * (num2[i] - '0')) + carry + add[position];
add[position] = value % 10;
carry = value / 10;
position--;
}
while (carry != 0)
{
int value = add[position] + carry;
add[position] = value % 10;
carry = value / 10;
position--;
}
}
bool flag = false;
for (int i = 0; i < maxPosition; i++)
{
if (add[i] == 0 && !flag)
continue;
else
{
result += (char)(add[i] + '0');
flag = true;
}
}
if (string.IsNullOrEmpty(result))
result = "0";
return result;
}
static void Main()
{
string num1 = "123";
string num2 = "456";
string result = MultiplyStrings(num1, num2);
Console.WriteLine("Result: " + result);
}
}
}