标签:
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note:
给出两个字符串分表表示两个数字,返回它们的乘积,结果仍然用字符串来表示。
注意: 数字可能是任意大小并且非负。
不允许将输入字符串转化为整数。
不能是使用类似大整数的函数库。
令两个字符串分别为A1、A2,求A1*A2乘法,需要用到小学的乘法计算方法,即对A1和A2中每一对数字做乘法,然后加到最终结果上去。令N1 = A1.size(),N2 = A2.size()。那么A1[I]表示的数为A1[I]*10N1-I-1,A2[J]表示的数为A2[J]*10N2-J-1,两者相乘等于A1[I]*A2[J]*10N1+N2-I-J-2。令结果数组为B[N1+N2],那么需要将结果加到I+J-1的位置。时间复杂度是O(N1*N2),给出代码如下:
string multiply(string num1, string num2) { int n1 = num1.size(); int n2 = num2.size(); string ret(n1+n2, ‘0‘); for (int i=0; i<n1; ++i) for (int j=0; j<n2; ++j) { int k = i+j+1; Add(ret, (num1[i]-‘0‘)*(num2[j]-‘0‘), k); } int i = 0; for (; i<n1+n2; ++i) { if (ret[i] != ‘0‘) break; } if (i==n1+n2) return "0"; else return ret.substr(i); } void Add(string& ret, int a, int i) { int carry = 0; while (carry!=0 || a!=0) { int k = a%10+carry+ret[i]-‘0‘; ret[i] = k%10+‘0‘; carry = k/10; a /= 10; --i; } }
标签:
原文地址:http://www.cnblogs.com/zhiguoxu/p/5474857.html