<p>Given two non-negative integers <code>num1</code> and <code>num2</code> represented as strings, return the product of <code>num1</code> and <code>num2</code>, also represented as a string.</p>

<p><strong>Note:</strong>&nbsp;You must not use any built-in BigInteger library or convert the inputs to integer directly.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> num1 = "2", num2 = "3"
<strong>Output:</strong> "6"
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> num1 = "123", num2 = "456"
<strong>Output:</strong> "56088"
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= num1.length, num2.length &lt;= 200</code></li>
	<li><code>num1</code> and <code>num2</code> consist of digits only.</li>
	<li>Both <code>num1</code> and <code>num2</code>&nbsp;do not contain any leading zero, except the number <code>0</code> itself.</li>
</ul>

class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") {
            return "0";
        }

        string res = "";

        for (int i = num1.length() - 1; i >= 0; i--) {
            int carry = 0;
            string tmp_res;

            for (int j = 0; j < num1.length() - i - 1; j++) {
                tmp_res += "0";
            }

            for (int j = num2. length() -1; j >= 0; j--) {
                int mult = (num1[i] - '0') * (num2[j] - '0') + carry;
                carry = mult / 10;
                tmp_res += (mult % 10 + '0');
            }

            if (carry > 0) {
                tmp_res += (carry + '0');
            }

            res = sum(res, tmp_res);
        }

        std::reverse(res.begin(), res.end());

        return res;
    }

std::string sum(const std::string& first, const std::string& second) {
    std::string res;
    int i = 0, carry = 0;

    // Loop until all digits in both strings are processed
    while (i < first.length() || i < second.length()) {
        int sum = carry;

        // Add digit from 'first' if available
        if (i < first.length()) {
            sum += first[i] - '0'; // Convert char to int
        }

        // Add digit from 'second' if available
        if (i < second.length()) {
            sum += second[i] - '0'; // Convert char to int
        }

        res += (sum % 10) + '0'; // Append the current digit to the result as char
        carry = sum / 10; // Update the carry
        i++;
    }

    // Append the carry if there is any left
    if (carry > 0) {
        res += carry + '0';
    }

    return res;
}
};
12685