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

大数乘法

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

分析:

       我写的这段代码可能对于大数乘法来说,不是最优的。但却是最好理解的。 下面讲解一下思路,因为上面那个数太大了,举个简单例子解释,我们让a = '24355', b ='432' , 过程如下:
       第一步: 从b的最低位开始(就是末尾3开始),拿出一个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)

输出结果:

全部评论

相关推荐

12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
11-03 12:40
中山大学 Java
勇敢的突尼斯海怪选钝...:楼主这拒意向话术好得体呀 !求问HR回复态度咋样呀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务