Leetcode_multiply-strings (updated c++ and python version)

62 篇文章 0 订阅
52 篇文章 0 订阅

地址:http://oj.leetcode.com/problems/multiply-strings/

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.

思路:大数m与n相乘,结果ans的第x位应该是从

1. m的第1位与n的第x位

2. m的第2位与n的第x-1位

...

x. m的第x位与n的第1位

上述x个结果求和。

体会一下,这个过程有点像卷积。

注意边界情况,如“0”, “000”这样的相乘。

python参考代码:1196ms

class Solution:
    # @param num1, a string
    # @param num2, a string
    # @return a string
    def multiply(self, num1, num2):
        if len(num1) < len(num2):
            tmp = num2
            num2 = num1
            num1 = tmp
        val = carry = 0
        ans = ""
        for i in range(0, len(num1)+len(num2)):
            for j in range(i+1, 0, -1):
                k = i+2-j
                if k>len(num2) or j>len(num1):
                    continue
                val += int(num1[-j]) * int(num2[-k])
            ans += str((val+carry)%10)
            carry = (val+carry)//10
            val = 0
        while carry>0:
            ans += str(carry%10)
            carry /= 10
        while len(ans)>1 and ans[-1]=="0":
            ans = ans[:-1]
        return ans[-1::-1]


c++, 52ms

 
 
class Solution {
public :
     string multiply ( string num1 , string num2 ) {
         if ( num1 == "0" || num2 == "0" )
             return "0" ;
         if ( num1 == "1" )
             return num2 ;
         if ( num2 == "1" )
             return num1 ;
         reverse ( num1 . begin (), num1 . end ());
         reverse ( num2 . begin (), num2 . end ());
         int sum = 0 , carry = 0 ;
         string ans ;
         for ( int i = 0 ; i < num1 . length () + num2 . length (); ++ i )
         {
             sum = 0 ;
             for ( int j = 0 ; j <= i ; ++ j )
             {
                 if ( j < num1 . length () && i - j < num2 . length ())
                     sum += ( num1 [ j ] - '0' ) * ( num2 [ i - j ] - '0' );
             }
             sum += carry ;
             carry = sum / 10 ;
             sum %= 10 ;
             ans += sum + '0' ;
         }
         reverse ( ans . begin (), ans . end ());
         int i = 0 ;
         for (; i < ans . length (); ++ i )
             if ( ans [ i ] != '0' )
                 break ;
         return ans . substr ( i );
     }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值