第六天:《LeetCode一天一例》-----大数乘法(python实现)

大数乘法

      题目:  a = '45755564532435735465878576'      b = '8765434234657373', a和b代表两个整数,我们想实现的就是将a和b进行相乘。两个大数相乘的结果一般都非常大,不是一个整型所能容纳的。。我们可以将计算结果用字符串或者列表的形式给出。。

分析:

       我写的这段代码可能对于大数乘法来说,不是最优的。但却是最好理解的。 下面讲解一下思路,因为上面那个数太大了,举个简单例子解释,我们让a = '24355', b ='432' , 过程如下:
       第一步: 从b的最低位开始(就是末尾2开始),拿出一个b中的元素与a中的所有元素进行相乘,这里不光要乘,还有考虑移位,如b中的倒数第二个元素(也就是拿出的第二个数)与a中的数进行相乘时,最低位要填充个零(下图的红色方块)。 b中倒数第三个元素与a中所有元素相乘时,最低位要填充两个零,以此类推。。  注意: 这里先不进行进位

      第二步: 在第一步中运算的结果前面给它填充零,主要是为了最后好运算。如图:

    第三步:就是把第二步中  图里面的最下面三行进行加法运算, 竖着加

    第四步:考虑进位的问题 , 从上图红框中的最低位开始,也就是从10开始  依次判断,将当前数除以10的余数放在当前位,商累加到前一位。。最后结果就出来了

  黄色框中即为运算的结果

代码实现:

def big_data_mult(a, b):
    a = list(a)
    b = list(b)
    # 把a拿着和b的每一位去乘 ,每乘一次, 结果向左移一位()

    # 列表的头插list.insert(0, item)
    temp = []
    temp_sub = []  # 存的是每次a与b中一位乘的结果
    for i in range(len(b)-1, -1,  -1):
        if len(b)-1 == i:  # 第一下乘 不需要移位
            pass
        else:
            # 插入k个零
            k = 1
            while k <= len(b) - 1 - i:
                temp_sub.insert(0, 0)
                k += 1
        for j in range(len(a)-1, -1, -1):
            # 拿b中一位与a中所有为进行相乘
            temp_sub.insert(0, int(b[i]) * int(a[j]))
        temp.append(temp_sub)
        temp_sub = []
    return temp

def fill_list(max_len, temp):
    temp_fill = []

    for item in temp:
        if len(item) < max_len:
            i = 0
            n = len(item)
            while i < max_len - n:
                item.insert(0, 0)
                i += 1
        temp_fill.append(item)
    return temp_fill

def get_result(temp_fill, maxlen):
    result = [0] * (max_len+1)

    # 将各列先累加起来 等会处理进位
    for i in range(max_len-1, -1, -1):
        for item in temp_fill:
            # 对因为累加起来  最后考虑进位
            result[i+1] += item[i]

    # 现在处理进位
    for i in range(len(result)-1, -1, -1):
        if result[i] >= 10:
            result[i-1] += result[i] // 10
            result[i] = result[i] % 10

    return result


if __name__ == "__main__":
    # a作为乘数, b作为被乘数
    a = '45755564532435735465878576'
    b = '8765434234657373'
    # 拿着b中的数与a中的每一位去乘
    temp = big_data_mult(a, b)

    # 现在的任务是找出temp中最长的那个串,将其他不够的进行填充   其实不用找了 肯定是temp的最后一个
    max_len = len(temp[-1])  # 找出了最长。然后在其他的头部填充,将其所有元素的长度搞成一致的

    temp_fill = fill_list(max_len, temp)
    # 这个打印的是填充好的所有行
    print("打印填充好的数组:\n")
    for i in temp_fill:
        print(i)
    # 将其对应位累加即可
    result = get_result(temp_fill, max_len)
    print(result)

输出结果:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

传道解惑也

打赏一下咯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值