Big Number Multiplication (C++ & C#)

Algorithm: Big Number Multiplication 
Category: Number Theory

Algorithm:

Initialization:
  • 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.
Nested Loop for Multiplication:
  • 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.
Adding Intermediate Results:
  • 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.
Traversing add Array:
  • 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.
Check for Result "0":
  • 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);
        }
    }
}