多项式相加(Python实现)

目录

多项式

使用列表存储多项式

使用字典存储多项式

使用链表存储多项式

解决方案

使用列表

使用字典

使用链表

传送门


多项式

多项式是数学中相当重要的表达方式,如果使用计算机来处理多项式的各种相关运算,通常可以使用线性表、链表和字典等数据结构来存储多项式。

假如一个多项式 P(x)=a_{n}X^{n}+a_{n-1}X^{n-1}+...+a_{1}X+a_{0} ,P(x)就为一个n次多项式。

使用列表存储多项式

使用一个二维列表来存储多项式。二维列表中的每个元素均为一个列表,存储多项式中某一项的指数和系数。例如多项式p=2X^{5}+3X^{4}+5X^{2}+4X+1 可以用二维列表表示为:

[[5, 2], [4, 3], [2, 5], [1, 4], [0, 1]]

使用字典存储多项式

字典也可以存储一个多项式。字典中以多项式指数为key,指数对应的系数和为value。例如多项式 p=2X^{5}+3X^{4}+5X^{2}+4X+1 可以用字典存储为:

{5: 2, 4: 3, 2: 5, 1: 4, 0: 1}

使用链表存储多项式

链表也可以存储多项式。每一个节点的数据域中,存储每项的系数和指数。

解决方案

使用列表

根据上面建立的数据结构模型,我们使用二维列表来表示和存储多项式。

class PolyException(Exception):
    def __init__(self, message, code):
        self.message = message
        self.code = code


def parse_poly(poly):
    """
    parse poly
    :param poly: string
    :return: list
    """
    poly_list = poly.split("+")
    result = []
    for pos in range(len(poly_list)):
        poly_list[pos] = poly_list[pos].strip()
        if "X" not in poly_list[pos]:
            if not poly_list[pos].isdigit():
                raise PolyException("poly format error.", 1001)

        temp_list = poly_list[pos].split("X^")
        if len(temp_list) != 2 and len(temp_list) != 1:
            raise PolyException("poly format error.", 1002)

        if len(temp_list) == 2:
            key = int(temp_list[1])
            if temp_list[0] == "":
                value = 1
            else:
                value = int(temp_list[0])
        else:
            key = 0
            value = int(temp_list[0])

        index = -1
        for i in range(len(result)):
            if result[i][0] == key:
                index = i
                break

        if index != -1:
            result[index][1] += value
        else:
            result.append([key, value])

    return result


def add(poly_a_list, poly_b_list):
    for data in poly_b_list:
        exist = False
        for i in range(len(poly_a_list)):
            if data[0] == poly_a_list[i][0]:
                poly_a_list[i][1] += data[1]
                exist = True
                break

        if not exist:
            poly_a_list.append(data)
    return poly_a_list


if __name__ == '__main__':
    # 1. 输入两个多项式
    try:
        poly_a = input("Input polynomial A: ")
        # poly_a = "X^4+1"
        poly_a_list = parse_poly(poly_a)
        poly_b = input("Input polynomial B: ")
        # poly_b = "3X^2+3X^4+3"
        poly_b_list = parse_poly(poly_b)

        # 2. 多项式相加
        result = add(poly_a_list, poly_b_list)

        # 3. 输出结果
        print("result is: ", end="")

        message_list = []
        for data in result:
            if data[0] == 0:
                message_list.append(str(data[1]))
            else:
                message_list.append(str(data[1]) + "X^" + str(data[0]))
        print("+".join(message_list))
    except PolyException as e:
        print("errcode: %s" % e.code)
        print("errmsg: %s" % e.message)

使用字典

下面采用字典数据结构来存储多项式。当多项式相加时,指数相同(即Key相同),系数相加(即Value相加合并),最后得到的字典就是两个多项式相加的结果。

class PolyException(Exception):
    def __init__(self, message, code):
        self.message = message
        self.code = code


def parse_poly(poly):
    """
    parse poly
    :param poly: string
    :return: dict
    """
    poly_list = poly.split("+")
    poly_dict = {}
    for pos in range(len(poly_list)):
        poly_list[pos] = poly_list[pos].strip()
        if "X" not in poly_list[pos]:
            if not poly_list[pos].isdigit():
                raise PolyException("poly format error.", 1001)

        temp_list = poly_list[pos].split("X^")
        if len(temp_list) != 2 and len(temp_list) != 1:
            raise PolyException("poly format error.", 1002)

        if len(temp_list) == 2:
            key = temp_list[1]
            value = temp_list[0]
        else:
            key = 0
            value = temp_list[0]

        if key in poly_dict:
            poly_dict[key] += value
        else:
            poly_dict[key] = value

    return poly_dict


if __name__ == '__main__':
    # 1. 输入两个多项式
    try:
        poly_a = input("Input polynomial A: ")
        # poly_a = "3X^4+1"
        poly_a_dict = parse_poly(poly_a)
        poly_b = input("Input polynomial B: ")
        # poly_b = "3X^4+5"
        poly_b_dict = parse_poly(poly_b)
    except PolyException as e:
        print("errcode: %s" % e.code)
        print("errmsg: %s" % e.message)
        exit(e.code)

    # 2. 多项式相加
    for key in poly_b_dict:
        if key in poly_a_dict:
            poly_a_dict[key] = int(poly_a_dict[key]) + int(poly_b_dict[key])
        else:
            poly_a_dict[key] = int(poly_b_dict[key])

    # 3. 输出结果
    print("result is: ")

    message = ""
    for key in poly_a_dict:
        if key == 0:
            message += str(poly_a_dict[key]) + " + "
        else:
            message += str(poly_a_dict[key]) + "X^" + str(key) + " + "
    message = message[:-3]
    print(message)

使用链表

我们使用单向链表结构来表示和存储多项式。不同于链接中单向链表的节点数据结构,我们重新定义节点结构PolyNode,并重写链表类,仅保留多项式相加相关的方法,并适配新的节点结构。我们将上述代码保存在link.py中:

class PolyNode(object):
    def __init__(self, value, exponent):
        self.value = value
        self.exponent = exponent
        self.next = None

    def __add__(self, other_node):
        self.next = other_node

    def __eq__(self, other_node):
        if self.value != other_node.value:
            return False
        elif self.exponent != other_node.exponent:
            return False
        else:
            return True

    def update(self, other_node):
        self.value = other_node.value
        self.exponent = other_node.exponent


class LinkedList(object):
    def __init__(self):
        self.head = PolyNode(0, 0)

    def empty(self) -> bool:
        return self.head.next is None

    def add(self, node):
        if self.empty():
            self.head + node
        else:
            ptr = self.head.next
            self.head + node
            node + ptr

    def extend(self, linked_list):
        if linked_list.empty():
            return

        point = self.head.next
        while point.next is not None:
            point = point.next
        point + linked_list.head.next
        return

    def remove(self, target: PolyNode):
        if self.empty():
            raise ValueError("remove from empty linked list")

        ptr = self.head.next
        left_ptr = self.head

        while True:
            if ptr == target:
                break

            if ptr.next is None:
                raise IndexError("value do not exist")

            ptr = ptr.next
            left_ptr = left_ptr.next

        if ptr.next is None:
            left_ptr.next = None
        else:
            left_ptr.next = ptr.next
        return

    def __len__(self):
        if self.empty():
            return 0

        ptr = self.head.next
        count = 0
        while ptr is not None:
            count += 1
            ptr = ptr.next
        return count

    def find(self, exponent):
        if self.empty():
            return

        ptr = self.head
        while ptr.next is not None:
            ptr = ptr.next
            if ptr.exponent == exponent:
                return ptr


def create() -> LinkedList:
    return LinkedList()


def parse_poly(poly):
    poly_list = poly.split("+")
    poly_linked = create()
    for pos in range(len(poly_list)):
        poly_list[pos] = poly_list[pos].strip()
        if "X" not in poly_list[pos]:
            if not poly_list[pos].isdigit():
                raise ValueError("poly format error.")

        temp_list = poly_list[pos].split("X^")
        if len(temp_list) != 2 and len(temp_list) != 1:
            raise ValueError("poly format error.")

        if len(temp_list) == 2:
            key = temp_list[1]
            value = temp_list[0]
        else:
            key = 0
            value = temp_list[0]

        if value == "":
            value = 1
        else:
            value = int(value)
        key = int(key)

        node = poly_linked.find(key)
        if node is None:
            poly_linked.add(PolyNode(value, key))
        else:
            value += node.value
            poly_linked.replace(node, PolyNode(value, key))
    return poly_linked


def add(linked1, linked2):
    ptr1 = linked1.head.next

    added_node = []
    while ptr1 is not None:
        ptr2 = linked2.head.next
        while ptr2 is not None:
            if ptr2.exponent == ptr1.exponent:
                ptr1.value += ptr2.value
                added_node.append(ptr2)
                break
            ptr2 = ptr2.next
        ptr1 = ptr1.next

    for node in added_node:
        linked2.remove(node)
    if len(linked2) > 0:
        linked1.extend(linked2)


def print_result(linked):
    print("result is:", end="")
    ptr = linked.head.next
    message_list = []
    while ptr is not None:
        if ptr.exponent == 0:
            message_list.append(str(ptr.value))
        else:
            message_list.append(str(ptr.value) + "X^" + str(ptr.exponent))
        ptr = ptr.next
    print("+".join(message_list))


if __name__ == '__main__':
    try:
        poly_a = input("Input polynomial A: ")
        # poly_a = "X^4+1"
        poly_a_linked = parse_poly(poly_a)

        poly_b = input("Input polynomial B: ")
        # poly_b = "3X^2+3X^4+6"
        poly_b_linked = parse_poly(poly_b)

        add(poly_a_linked, poly_b_linked)
        print_result(poly_a_linked)
    except ValueError as e:
        print(str(e))

传送门

str.split()方法

len()函数

range()函数

str.strip()方法

str.isdigit()方法

input()函数

print()函数

str()函数

list.append()方法

str.join()方法

  • 12
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python实现多项式相加的一般步骤如下: 1. 定义多项式类:创建一个多项式类,用于表示和操作多项式。可以使用列表或字典等数据结构来存储多项式的系数和指数。 2. 初始化多项式:在多项式类中,定义初始化方法,将输入的多项式字符串转换为字典,其中字典的键为指数,值为系数。 3. 实现多项式相加函数:定义一个函数,接收两个多项式字典作为参数,将它们相加并返回一个新的多项式字典。 4. 输入多项式:从用户处获取两个多项式的输入,将它们转换为字典。 5. 调用多项式相加函数:将两个多项式字典作为参数传递给多项式相加函数,得到一个新的多项式字典。 6. 输出结果:从新的多项式字典中获取指定指数的系数,输出结果。 具体实现可以参考以下代码: ``` # 定义多项式类 class Polynomial: def __init__(self, poly_str): self.poly_dict = {} terms = poly_str.split(',') for term in terms: coef, exp = term.strip().split() self.poly_dict[int(exp)] = int(coef) # 实现多项式相加函数 def add_polynomials(poly1, poly2): result = {} for exp in set(poly1.keys()) | set(poly2.keys()): result[exp] = poly1.get(exp, 0) + poly2.get(exp, 0) return result # 输入多项式 poly_str1 = input("请输入第一个多项式:") poly_str2 = input("请输入第二个多项式:") x = int(input("请输入要求的指数:")) # 初始化多项式 poly1 = Polynomial(poly_str1).poly_dict poly2 = Polynomial(poly_str2).poly_dict # 调用多项式相加函数 result = add_polynomials(poly1, poly2) # 输出结果 print("结果为:", result.get(x, 0)) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值