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;
}


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

Leetcode43 Multiply Strings

Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as...

LeetCode 43 - Multiply Strings

Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as...
  • ywcpig
  • ywcpig
  • 2016年03月03日 16:00
  • 184

leetcode 43. Multiply Strings 9大数相差(java实现)

原题: Given two non-negative integers num1 and num2 represented as strings, return the product ...
  • fyy607
  • fyy607
  • 2017年01月06日 16:53
  • 89

【一天一道LeetCode】#43. Multiply Strings

一天一道LeetCode系列(一)题目 Given two numbers represented as strings, return multiplication of the numbers...

[leetcode]43. Multiply Strings@Java

这其实是一道大数相乘问题,类似的题目我之前的博客已经发过了,今天相当于复习一下吧 https://leetcode.com/problems/multiply-strings/#/descr...

LeetCode43——Multiply Strings

LeetCode43——Multiply Strings 题意: 做乘法,两个乘数都是string类型的。 直接string转整型是不行的,因为大数相乘可能溢出。 之前做过类似的大数乘法。其思...

[LeetCode43] Multiply Strings

Given two numbers represented as strings, return multiplication of the numbers as a string. Note: T...
  • sbitswc
  • sbitswc
  • 2014年05月13日 07:03
  • 560

LeetCode_43---Multiply Strings

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

[LeetCode]43.Multiply Strings

【题目】 Given two numbers represented as strings, return multiplication of the numbers as a string. ...

LeetCode 43 Multiply Strings

题意: 输入2个表示非负数的字符串,求它们的乘积。 思路: 暴力模拟吧!!19ms能过。 我利用单个位置上数字只有10个来优化乘法次数,效率能提高到9ms。 代码: /**...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode 43. Multiply Strings
举报原因:
原因补充:

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