关闭

Leetcode 43. Multiply Strings

标签: leetcode
99人阅读 评论(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.
其实就是用字符串实现两个大数的相乘。

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

在这之前,让我们回忆一下小学学习乘法的场景吧。个位数乘法,是背诵乘法口诀表度过的,不提也罢;两位数乘法是怎么做的呢?现在就来一起回忆下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;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:30831次
    • 积分:1366
    • 等级:
    • 排名:千里之外
    • 原创:108篇
    • 转载:16篇
    • 译文:0篇
    • 评论:14条
    最新评论