<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:

    std::string
    multC( std::string num, char c ) {
        if( c == '0' ) {
            return "0";
        }

        int ci = c - '0';

        std::string ans;
        int carry = 0;

        for( auto i = num.rbegin(); i != num.rend(); i++ ) {
            int x = carry + ci * ( *i - '0' );
            carry = x / 10;
            x %= 10;
            ans += ( x + '0' );
        }

        if( carry ) {
            ans += ( carry + '0' );
        }

        std::ranges::reverse( ans );

        return ans;
    }

    std::string
    add( std::string num1, std::string num2 ) {

        auto [ s1, s2 ] = num1.size() >= num2.size() ? pair{ num1, num2 } : pair{ num2, num1 };
        std::string ans;

        std::ranges::reverse( s1 );
        std::ranges::reverse( s2 );

        int carry = 0;
        for( long i = 0; i < s2.size(); i++ ) {
            int x = carry + s1[ i ] - '0' + s2[ i ] - '0';
            carry = x / 10;
            x %= 10;
            ans += ( x + '0' );
        }

        for( long i = s2.size(); i < s1.size(); i++ ) {
            int x = carry + s1[ i ] - '0';
            carry = x / 10;
            x %= 10;
            ans += ( x + '0' );
        }

        if( carry ) {
            ans += ( carry + '0' );
        }

        std::ranges::reverse( ans );

        return ans;
    }

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

        unsigned long scale = 0;
        std::vector< std::string > subParts;

        for( auto i = num1.rbegin(); i != num1.rend(); i++ ) {
            auto a = multC( num2, *i );
            if( a != "0" ) {
                for( auto n = scale; n > 0; n-- ) {
                    a += "0";
                }
                subParts.push_back( a );
            }

            scale++;
        }

        std::string res =  "0";
        
        for( auto i : subParts ) {
            res = add( i, res );
        }

        return res;
    }
};
18551