返回

两数相加:探索十进制、二进制和链表中的加法奥秘

前端

两数相加概况

两数相加是计算机科学和数学中一项基本且重要的操作。它涉及将两个数字相加并得到它们的和。两数相加可以应用于各种场景,从日常计算到复杂算法。

十进制两数相加

十进制两数相加是我们最熟悉的方法。它按照十进制数字系统进行操作,其中每个数字表示特定位置的权重(个位、十位、百位等)。加法过程从最右边开始,逐位相加,并将进位保留到下一位。

代码示例:

def add_decimal_numbers(num1, num2):
    result = []
    carry = 0

    # 从最低位开始相加
    while num1 or num2 or carry:
        digit1 = num1 % 10 if num1 else 0
        digit2 = num2 % 10 if num2 else 0
        sum = digit1 + digit2 + carry
        carry = sum // 10
        result.append(sum % 10)
        num1 //= 10
        num2 //= 10

    # 反转结果列表以得到正确的数字
    result.reverse()
    return ''.join(map(str, result))

二进制两数相加

二进制两数相加遵循与十进制类似的原则,但它在二进制数系统中进行,其中数字只有 0 和 1。二进制相加的规则更简单:0 + 0 = 0、0 + 1 = 1、1 + 0 = 1 和 1 + 1 = 10(产生一个进位)。

代码示例:

def add_binary_numbers(bin1, bin2):
    result = []
    carry = 0

    # 从最低位开始相加
    while bin1 or bin2 or carry:
        digit1 = int(bin1[-1]) if bin1 else 0
        digit2 = int(bin2[-1]) if bin2 else 0
        sum = digit1 + digit2 + carry
        carry = sum // 2
        result.append(sum % 2)
        bin1 = bin1[:-1] if bin1 else ''
        bin2 = bin2[:-1] if bin2 else ''

    # 反转结果列表以得到正确的二进制数
    result.reverse()
    return ''.join(map(str, result))

链表式两数相加

链表式两数相加是一种更通用的方法,它处理存储在链表中的数字。链表中的每个节点表示一个数字,节点之间的指针链接表示数字的位置。

代码示例:

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

def add_linked_list_numbers(l1, l2):
    dummy = ListNode()
    current = dummy
    carry = 0

    # 逐节点相加
    while l1 or l2 or carry:
        val1 = l1.val if l1 else 0
        val2 = l2.val if l2 else 0
        sum = val1 + val2 + carry
        carry = sum // 10
        current.next = ListNode(sum % 10)
        current = current.next
        l1 = l1.next if l1 else None
        l2 = l2.next if l2 else None

    # 返回结果链表的第一个节点(跳过哑节点)
    return dummy.next

解题思路

虽然这三种方法看似不同,但它们都遵循相同的核心原则:逐位相加,将进位保留到下一位。关键的区别在于它们处理数字的方式,十进制直接使用数字,二进制使用 0 和 1,而链表式使用指针连接的节点。

示例

  • 十进制: 相加 123 和 456,得到 579。
  • 二进制: 相加 1101 和 1011,得到 10110。
  • 链表: 相加链表 [2, 4, 3] 和 [5, 6, 4],得到链表 [7, 0, 8]。

结论

两数相加是一个看似简单但应用广泛的操作,在计算机科学和数学中至关重要。通过理解十进制、二进制和链表式两数相加的不同方法,您可以扩展您的算法技能并有效解决各种问题。练习这些方法并深入了解它们的底层原理,将帮助您成为一名熟练的程序员和算法专家。