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

题目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
  • 2853

leetcode - 43.Multiply Strings

Multiply Strings

Leetcode 43 - Multiply Strings(高精度乘)

题意实现高精度乘法。思路模拟即可,但是模拟也是有方法的。算法1直接像我们手算乘法一样模拟,每次计算出来的一位都要保证小于10并且记录进位。过程如下:算法2比算法1简单很多。还是像手算乘法一样,但是比如...
  • Lzedo
  • Lzedo
  • 2017-03-16 08:02
  • 170

Leetcode 43. Multiply Strings

/* Leetcode 43. Multiply Strings Given two numbers represented as strings, return multiplication of ...

LeetCode OJ-43-Multiply Strings

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

LeetCode 43. Multiply Strings

LeetCode 43. Multiply Strings 分析与解答

【LeetCode】43. Multiply Strings 大数相乘算法

【LeetCode】43. Multiply Strings 大数相乘算法题目要求:Given two numbers represented as strings, return multiplic...

leetcode 43. Multiply Strings

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

LeetCode43 Multiply Strings

原题:英: Given two non-negative integers num1 and num2 represented as strings, return the product ...

Leetcode43 Multiply Strings

Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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