📌  相关文章
📜  用链表表示的两个数字相乘的Python程序(1)

📅  最后修改于: 2023-12-03 15:11:19.807000             🧑  作者: Mango

用链表表示的两个数字相乘的Python程序

本文将介绍如何用Python编写用链表表示的两个数字相乘的程序,该程序可以将两个大数相乘,解决传统整数乘法的精度问题。

问题描述

假设我们有两个用链表表示的非负整数,每个节点包含一个数字,并且数字按照逆序存储,现在需要编写一个函数将这两个数相乘并返回结果。

例如,给定两个链表 2->4->3 和 5->6->4,表示数字 342 和 465,返回乘积 199998。

解决方案

我们可以使用类似于传统的竖式乘法的方法,从低位到高位逐位相乘。具体来说,我们可以遍历第一个链表的每个数字,同时遍历第二个链表的每个数字,将它们相乘并保存结果。最后,再将这些乘积相加得到最终结果。

由于链表中的数字是逆序存储的,所以我们需要将其转换成正序,这可以通过将链表翻转来实现。

需要注意的是,我们可能会得到很大的结果,因此需要使用一个数组来存储所有的乘积。然后使用一个循环将数组中的所有数字加起来,并得到最终的结果。

程序代码如下:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def multiplyTwoNumbers(l1: ListNode, l2: ListNode) -> int:
    num1, num2 = [], []
    while l1:
        num1.append(l1.val)
        l1 = l1.next
    while l2:
        num2.append(l2.val)
        l2 = l2.next
    n, m = len(num1), len(num2)
    prod = [0] * (n + m)
    for i in range(n):
        for j in range(m):
            prod[i + j] += num1[i] * num2[j]
            prod[i + j + 1] += prod[i + j] // 10
            prod[i + j] %= 10
    while len(prod) > 1 and prod[-1] == 0:
        prod.pop()
    return ''.join(str(x) for x in prod[::-1])

l1 = ListNode(2)
l1.next = ListNode(4)
l1.next.next = ListNode(3)
l2 = ListNode(5)
l2.next = ListNode(6)
l2.next.next = ListNode(4)
ans = multiplyTwoNumbers(l1, l2)
print(ans)
代码说明
  • 首先定义了一个 ListNode 类,表示链表中的每个节点。
  • 然后定义了一个 multiplyTwoNumbers 函数,它接受两个 ListNode 类型的变量 l1 和 l2,并返回它们的乘积。
  • 在 multiplyTwoNumbers 函数中,遍历链表 l1 和 l2,将它们表示的整数存储在 num1 和 num2 数组中。
  • 使用 prod 数组保存乘积的每一位,并且最后将数组中的所有数字加起来得到最终结果。
  • 注意,由于返回的结果是一个整数,因此需要将 prod 数组中的数字转换成字符串,并且反转字符串得到正序的结果。
  • 最后,测试代码创建链表并调用函数进行计算。
总结

本文介绍了如何用Python编写用链表表示的两个数字相乘的程序。该程序可以将两个大数相乘,解决传统整数乘法的精度问题。通过本文的介绍,我们可以了解到这种方法实现的原理,并可以更好地理解链表数据结构的应用。