码迷,mamicode.com
首页 > 其他好文 > 详细

43. Multiply Strings

时间:2016-05-09 18:31:38      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

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.
  • Converting the input string to integer is NOT allowed.
  • You should NOT use internal library such as BigInteger.

给出两个字符串分表表示两个数字,返回它们的乘积,结果仍然用字符串来表示。

注意: 数字可能是任意大小并且非负。

    不允许将输入字符串转化为整数。

    不能是使用类似大整数的函数库。

令两个字符串分别为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;
    }
}

 

43. Multiply Strings

标签:

原文地址:http://www.cnblogs.com/zhiguoxu/p/5474857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!