Leetcode 43. Multiply Strings

原创 2016年06月01日 19:32:46

题目描述:

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.
其实就是用字符串实现两个大数的相乘。

大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大范围,此时如果需要得到精确结果,就不能常规的使用乘号直接计算了。没错,就需要采用分治的思想,将乘数“分割”,将大整数计算转换为小整数计算。 

在这之前,让我们回忆一下小学学习乘法的场景吧。个位数乘法,是背诵乘法口诀表度过的,不提也罢;两位数乘法是怎么做的呢?现在就来一起回忆下12*34吧: 
   3  4  (是不是很多小朋友喜欢将大的整数作为被乘数的,呵呵) 
 *1  2 
--------- 
   6  8 
3 4 
--------- 
4 0  8 

接下来就是找规律了。其实大家多做几个两位数的乘法,都会发现这个规律:AB * CD = AC (AD+BC) BD 。没错,这里如果BD相乘超过一位数,需要进位(这里二四得八,没有进位);(AD+BC+低位进位)如果超过一位数,需要进位(就像刚才的3*1,最后+1得4的操作)。

用相应的数据解释一下即:

s1="12";

s2="34"

AC=3,

BD=8,

AD+BC=10;

其中AD+BC超过一位了,需要进位1,所有中间位为0,第一位为AC+1(进位)=4

所以结果为408.

根据此思路,M位数乘以N位数用类似的原理

AC代码如下:

string multiply(string num1, string num2)
{
    //考虑乘积为0的情况
    if(num1 == "0" || num2 == "0")
        return "0";
    //第一步,将两个字符串转换为整型数组
    int len1 = num1.length();
    int len2 = num2.length();
    int *n1 = new int[len1];
    int *n2 = new int[len2];
    for(int i = 0 ;i < len1;i++)
        n1[i] = num1[i] - '0';
    for(int i = 0;i < len2;i++)
        n2[i] = num2[i] - '0';
    //新建一个res整型数组存放中间结果
    int *res = new int[len1 + len2];
    memset(res,0,sizeof(int)*(len1+len2));
    //重点部分
    for(int i = 0;i < len1;i++)
        for(int j = 0;j < len2;j++)
            res[i + j] += n1[i] * n2[j];
    //res[i] 只能有一位,多的要进位,因此将进位处理后的结果放入temp整型数组中
    //temp中每一位只能有一个数字,其中temp[0]可能有2位,因此要最后通过carry判断有无进位
    int carry = 0;
    int *temp = new int[len1 + len2];
    memset(temp,0,sizeof(int)*(len1+len2));
    for(int i = len1 + len2 -2;i >= 0;i--)
    {
        temp[i] = res[i] + carry;
        carry = temp[i] / 10;
        temp[i] = temp[i] % 10;

    }
    //carry 最后大于0表示temp有进位
    string ans ="";
    if(carry > 0 )
        ans = ans+ char(carry + '0');
    for(int k = 0;k <= len1 + len2 -2;k++)
        ans = ans + char(temp[k] + '0');
    return ans;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

[leetcode-43]Multiply Strings(java)

问题描述: Given two numbers represented as strings, return multiplication of the numbers as a string.No...
  • zdavb
  • zdavb
  • 2015年07月30日 21:37
  • 643

LeetCode(43)Multiply Strings

题目Given two numbers represented as strings, return multiplication of the numbers as a string.Note: T...
  • fly_yr
  • fly_yr
  • 2015年08月28日 17:42
  • 3240

LeetCode --- 43. Multiply Strings

题目链接:Multiply Strings Given two numbers represented as strings, return multiplication of the numbers...
  • makuiyu
  • makuiyu
  • 2015年02月10日 08:57
  • 2039

leetcode 82: Multiply String

Multiply StringsMar 12 '12 Given two numbers represented as strings, return multiplication of...
  • xudli
  • xudli
  • 2013年02月18日 17:47
  • 1030

leetcode -- Multiply Strings -- python容易处理,需要看其他解法

https://leetcode.com/problems/multiply-strings/python 一行搞定。因为乘法结果太大的话,python会自动增加存储位数。这道题目还要看看其他解法。 ...
  • xyqzki
  • xyqzki
  • 2015年12月10日 18:18
  • 850

LeetCode--Multiply Strings

Given two numbers represented as strings, return multiplication of the numbers as a string. Note:...
  • shaya118
  • shaya118
  • 2015年01月16日 10:23
  • 527

[LeetCode-Java]43. Multiply Strings

Given two numbers represented as strings, return multiplication of the numbers as a string.Note: Th...
  • qq_32199531
  • qq_32199531
  • 2016年10月08日 20:34
  • 619

LeetCode OJ:Multiply Strings

Multiply Strings   Given two numbers represented as strings, return multiplication of the nu...
  • starcuan
  • starcuan
  • 2014年01月29日 18:10
  • 646

<LeetCode OJ> 43. Multiply Strings

43. Multiply Strings My Submissions Question Total Accepted: 51859 Total Submissions: 231017 Dif...
  • EbowTang
  • EbowTang
  • 2016年01月24日 21:25
  • 1834

Leetcode #43. Multiply Strings 字符串相乘 解题报告

说了是用两个字符串代表的值做相乘。。其实也就是高精度乘法了。。按照高精度乘法的方式去做好了首先转换下字符串到数字数组,让乘数的每一个数字分别和被乘数相乘,注意进位,记得对准位置就好。一般来说保存结果的...
  • MebiuW
  • MebiuW
  • 2016年04月14日 23:57
  • 668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode 43. Multiply Strings
举报原因:
原因补充:

(最多只允许输入30个字)