string multiplication

和我们正常做乘法一样,从后往前乘,考虑当前两个位数,余数和进数以及已经算出来的结果不停地update结果就可以了。唯一有问题的就是考虑前面位数为000的时候,要重新扫一遍。


#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
	string multiply(std::string num1, std::string num2) {
		int n1=num1.size();
		int n2=num2.size();
		if (n1==0 || n2==0)
			return "0";
		string res(n1+n2+1,'0');
		reverse(num1.begin(),num1.end());
		reverse(num2.begin(),num2.end());

		for (int i=0; i<n1; i++){
			int dig1=num1[i]-'0';
			int carry=0;
			for (int j=0; j<n2; j++){
				int exist=res[i+j]-'0';
				int dig2=num2[j]-'0';
				res[i+j]=(dig1*dig2+exist+carry)%10+'0';
				carry=(dig1*dig2+exist+carry)/10;
			}
			if (carry>0)
				res[i+n2]=carry+'0';
		}
		reverse(res.begin(),res.end());
		int start=0;
		while(res[start]=='0' && start<res.size())
			start++;
		if (start==res.size())
			return "0";
		return res.substr(start,res.size()-start);
	}
};

int main() {
	string num1 = "0";
	string num2 = "0";
	Solution s;
	cout << num1 << "*" << num2 << "=";
	cout << s.multiply(num1, num2) << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值