LeetCode: Multiply Strings

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.


class Solution {
public:
    string multiply(string num1, string num2) {
        int size1 = num1.size(), size2 = num2.size();
        if((size1 == 1 && num1[0] == '0') || (size2 == 1 && num2[0] == '0'))
            return "0";
        vector<int> digit1, digit2;
        vector<int> temp(size1+size2, 0);
        vector<vector<int> > results(size2, temp); 
        string sumString = "";
        for(int i = 0; i < size1; i++)
        {
            digit1.insert(digit1.begin(), num1[i] - 48);
        }
        for(int i = 0; i < size2; i++)
        {
            digit2.insert(digit2.begin(), num2[i] - 48);
        }
        for(int i = 0; i < size2; i++)
        {
            int carry = 0;
            for(int j = 0; j < size1; j++)
            {
                results[i][i+j] = (digit1[j] * digit2[i] + carry) % 10;
                carry = (digit1[j] * digit2[i] + carry) / 10;
            }
            results[i][i+size1] = carry;
        }
        int carry = 0;
        for(int i = 0; i < size1 + size2; i++)
        {
            int sum = 0;
            for(int j = 0; j < size2; j++)
            {
                sum += results[j][i];
            }
            temp[i] = (sum + carry) % 10;
            carry = (sum + carry) / 10;
        }
        int start = temp[size1+size2-1] == 0 ? size1+size2-2 : size1+size2-1;
        for(int i = start; i >= 0; i--)
        {
            sumString += (temp[i] + 48);
        }
        return sumString;
        
        
    }
    
    
};

Round 2:

class Solution {
public:
    string multiply(string num1, string num2) {
        string base = "";
        string pre = "";
		string cur = "";
		if(num1 == "0" || num2 == "0")
		    return "0";
        for(int i = num1.size()-1; i >= 0; i--)
        {
			int carry = 0;
            cur = base;
            for(int j = num2.size()-1; j >=0; j--)
            {
				cur += ((((num1[i] - '0') * (num2[j] - '0') + carry) % 10)  + '0');
                carry = ((num1[i] - '0') * (num2[j] - '0') + carry) / 10;
            }
            if(carry)
                cur += (carry + '0');
			carry = 0;
			for(int x = 0; x < cur.size(); x++)
			{
				if(pre == "")
					break;
				if(x < pre.size())
				{
					int temp = carry;
					carry = (cur[x] - '0' + pre[x]  - '0'+ carry)/10;
					cur[x] = ((cur[x] - '0' + pre[x] - '0' + temp)%10) + '0';
				}
				else
				{
					int temp = carry;
					carry = (cur[x]-'0' + carry)/10;
					cur[x] = ((cur[x]-'0' + temp)%10) + '0';
				}
			}
			if(carry)
				cur += (carry + '0');
            pre = cur;
			base += "0";
        }
		int l = 0, r = cur.size()-1;
		while(l < r)
		{
			char temp = cur[l];
			cur[l] = cur[r];
			cur[r] = temp;
			l++;
			r--;
		}
		return cur;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值