<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 {
    string addStrings(string nums1, string nums2) {
        
        string res="";
        int co=0;
        for(int i=nums1.size()-1,j=nums2.size()-1;i>=0 || j>=0;--i,--j){
            int n1=0;
            int n2=0;
            if(j>=0)
                n2=nums2[j]-'0';
            if(i>=0)
                n1=nums1[i]-'0';
            int sum=n1+n2+co;
            res+=('0'+(char)sum%10);
            co=sum/10;
        }
        if(co==1)
            res+='1';
        reverse(res.begin(),res.end());
        return res;
    }
public:
    string multiply(string num1, string num2) {
        if(num1=="0" || num2=="0")
            return "0";
        //assume num2 longer than num1
        if(num1.size()>num2.size())
            swap(num1,num2);

        auto ctoi=[](const char c){
            return static_cast<int> (c-'0');
        };
        auto itoc=[](const int i) ->char{
            return static_cast<char> (i)+'0';
        };
        int zeros=0;
        string res_p="0";
        for(int i=num1.size()-1;i>=0;--i)
        {   
            string res="";
            for(int z=0;z<zeros;++z)
                res+='0';
            int co=0;
            for(int j=num2.size()-1;j>=0;--j){
                int mul=ctoi(num1[i])*ctoi(num2[j])+co;
                co=mul/10;
                char dig=itoc(mul%10);
                res+=dig;
            }

            if(co>0)
                res+=itoc(co);
            reverse(res.begin(),res.end());
            // add current with previous
            res=addStrings(res,res_p);
            res_p=std::move(res);
            ++zeros;
        }
        return res_p;
    }
};
13611