C++实验——STL多项式加法

本文介绍了一种使用C++ STL库简化多项式加法的方法,通过sort、merge和unique函数,实现了多项式的高效合并与去重,提供了一个具体的代码实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

①编制多项式加法的类:

例如若p1 = 2x6 + 3x4 + 5x2 + 6,p2 = 2x5 - 3x4 + 5x2 + 8,则p3 = p1 + p2 = 2x6 + 2x5 + 10x2 + 14。

分析传统的做法:

(1)多项式用list容器表示,容器内的每一个元素代表多项式中的每一项。设置多项式p1,p2,并使结果p3结果为空。

(2)利用sort系统函数,使多项式p1,p2中每一项按系数升序排列。

(3)利用iterator技术遍历p1,p2。当p1,p2没有检测完各自的链表时,比较当前结点的指数域。

(4)指数相等,对应项系数相加。若相加结果不为0,则结果加入p3,否则不加入p3。p1,p2各自的iterator迭代指针都进1。

(5)指数不等,小系数者加入p3,相应的迭代器指针进1。

(6)当p1,p2的iterator迭代指针已经有一个检测完毕,把另一个链表的剩余部分加入p3即可,采用函数是系统函数splice。

②上面我们介绍的是传统的做法,接下来介绍的是利用STL的系统函数简便的完成多项式的相加。

(1)利用sort系统函数,使多项式p1,p2中每一项按系数升序排列。

(2)利用merge函数将p1和p2合并,合并后只剩p1。

(3)利用unique函数将p1去掉重复的多项式(需要重载等于号以指数为基准),去除的同时需要将两指数相等的进行相加,具体看代码实现。

(4)然后利用迭代器遍历p1,将每一个多项式push_back到p3中,这就实现了多项式的相加。

③代码实现

头文件AddPolynomial.h

#ifndef ADDPOLYNOMIAL_H_INCLUDED
#define ADDPOLYNOMIAL_H_INCLUDED

#include <iostream>
#include <list>
#include <string>

using namespace std;

class Term
{
private:
    int coef;
    int exp;
public:
    Term(int coef,int exp):coef(coef),exp(exp){}
    int GetCoef()
    {
        return coef;
    }
    int GetExp()
    {
        return exp;
    }
    bool operator<(Term& t)
    {
        return exp < t.GetExp();
    }
    bool operator==(Term& t)     //重载等于号支持去重
    {
        if(exp == t.GetExp())
            this->coef = coef + t.GetCoef();
        else
            NULL;
        return exp == t.GetExp();
    }
};

typedef list<Term> LISTTERM;

ostream &operator<<(ostream& os,Term& t)
{
    os << t.GetCoef() << "x" << t.GetExp();
    return os;
}

class Polynomial
{
private:
    LISTTERM m_stlTermList;
public:
    bool AddTerm(const Term& t)
    {
        m_stlTermList.push_back(t);
        return true;
    }
    Polynomial AddPolynomial(Polynomial& obj)
    {
        Polynomial result;
        m_stlTermList.sort();            //p1排序
        obj.m_stlTermList.sort();          //p2排序
        m_stlTermList.merge(obj.m_stlTermList);  //p1合并p2
        m_stlTermList.unique();            //去重

        LISTTERM::iterator it = m_stlTermList.begin();  //放入p3中
        for(;it != m_stlTermList.end(); it++)
        {
            result.m_stlTermList.push_back(*it);
        }
        return result;
    }

    void Show()
    {
        LISTTERM::iterator it = m_stlTermList.begin();
        while(it != m_stlTermList.end())
        {
            if((*it).GetCoef() == 0)
            {
                it++;
                continue;
            }
            cout << *it << "+";
            it++;
        }
    }
};


#endif // ADDPOLYNOMIAL_H_INCLUDED

主函数main.cpp

#include "AddPolynomial.h"


int main()
{
    Polynomial p1;
    Polynomial p2;

    Term t1(2,6);
    Term t2(3,4);
    Term t3(5,2);
    Term t4(6,0);

    p1.AddTerm(t1);
    p1.AddTerm(t2);
    p1.AddTerm(t3);
    p1.AddTerm(t4);

    Term t5(2,5);
    Term t6(-3,4);
    Term t7(5,2);
    Term t8(8,0);

    p2.AddTerm(t5);
    p2.AddTerm(t6);
    p2.AddTerm(t7);
    p2.AddTerm(t8);

    cout << "多项式1:";
    p1.Show();
    cout << "\n多项式2:";
    p2.Show();
    cout << "\n合并之后的多项式:";
    Polynomial p3 = p1.AddPolynomial(p2);
    p3.Show();

    return 0;
}

这样就是用list容器的函数简便的完成了多项式的相加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值