多项式的构造和加减

场景说明:在这里实现了多项式的的构建,例如2x(2)+4x(4),因为水平有限,因此使用的括号代表的是指数。最有意思的应该是在一个完整的多项式中插入一个多项式,其中有相同指数的合并,还有插入。通过分类讨论:

1)没有节点,直接添加

2)只有一个节点,合并或者在前驱插入,或者在后继添加

3)两个节点的情况下,使用两两组合的方式,查找合适的位置。

typedef struct SPolynomial
{
    float coef;
    int expn;
    SPolynomial* pNextSPolynomial;
}SPolynomial;
class CPolyn
{
private:
    SPolynomial* m_pSPolynomialHeader;
public:
    CPolyn()
    {
        m_pSPolynomialHeader=NULL;
    }
    ~CPolyn()
    {
        if(NULL==m_pSPolynomialHeader) return;
        SPolynomial* pTmp=m_pSPolynomialHeader;
        while(NULL!=pTmp)
        {
            free(pTmp);
            m_pSPolynomialHeader=pTmp->pNextSPolynomial;
        }
    }
    int AddPolyn(float coef,int expn)
    {
        //2.create insert node
        SPolynomial* p=new SPolynomial;
        //SPolynomial* p=(SPolynomial*)malloc(sizeof(SPolynomial));
        p->coef=coef;
        p->expn=expn;
        p->pNextSPolynomial=NULL;
        //3.if polynheader is null,add and return
        if(NULL==m_pSPolynomialHeader)
        {
            m_pSPolynomialHeader=p;
            return 0;
        }
        //4.if polynheader has only one node
        if(m_pSPolynomialHeader->expn>p->expn)
        {
            p->pNextSPolynomial=m_pSPolynomialHeader;
            m_pSPolynomialHeader=p;
            return 0;
        }
        if(m_pSPolynomialHeader->expn==p->expn)
        {
            m_pSPolynomialHeader->coef+=p->coef;
            delete p;
            return 0;
        }
        //1.assing polynheader to tmp
        SPolynomial* pTmpSPolynomial=m_pSPolynomialHeader;
        //4.if polynheader only have two node,if a1.expn<p->expn<a2.expn,insert between
        if(NULL!=m_pSPolynomialHeader->pNextSPolynomial)
        {
            if((m_pSPolynomialHeader->expn<p->expn)&&(p->expn<m_pSPolynomialHeader->pNextSPolynomial->expn))
            {
                p->pNextSPolynomial=m_pSPolynomialHeader->pNextSPolynomial;
                m_pSPolynomialHeader->pNextSPolynomial=p;
                return 0;
            }
        }
        //5 transever all node
        while((NULL!=pTmpSPolynomial->pNextSPolynomial))
        {
            if(pTmpSPolynomial->expn==p->expn)
            {
                pTmpSPolynomial->coef=pTmpSPolynomial->coef+p->coef;
                delete p;
                return 0;
            }
            if(pTmpSPolynomial->pNextSPolynomial->expn==p->expn)
            {
                pTmpSPolynomial->pNextSPolynomial->coef+=p->coef;
                delete p;
                return 0;
            }
            if((pTmpSPolynomial->expn<p->expn)&&(pTmpSPolynomial->pNextSPolynomial->expn<p->expn))
            {
                pTmpSPolynomial=pTmpSPolynomial->pNextSPolynomial;
            }
            else if((pTmpSPolynomial->expn<p->expn)&&(pTmpSPolynomial->pNextSPolynomial->expn>p->expn))
            {
                p->pNextSPolynomial=pTmpSPolynomial->pNextSPolynomial;
                pTmpSPolynomial->pNextSPolynomial=p;
                return 0;
            }
        }
        pTmpSPolynomial->pNextSPolynomial=p;
        return 0;
    }
    void PrintPolyn()
    {
        SPolynomial* pTmp=m_pSPolynomialHeader;
        while(NULL!=pTmp)
        {
            cout<<"coef:"<<pTmp->coef<<"  "<<"expn:"<<pTmp->expn<<endl;
            pTmp=pTmp->pNextSPolynomial;
        }
    }
    int PolyLength()
    {
        SPolynomial* pTmp=m_pSPolynomialHeader;
        int nLen=0;
        while(NULL!=pTmp)
        {
            nLen++;
            pTmp=pTmp->pNextSPolynomial;
        }
        return nLen;
    }
    int AddOnePolynToPoly(CPolyn* p)
    {
        //of course we can use addPolyn function to finish it but not effective
        //first step we should sketch one SPolynomial coef and expn and then use
        //AddPolyn(coef,expn)finish it ,however every time we should traserval every link
        //list
        float coef=0;
        int expn=0;
        while((-1)!=p->PopPolyn(coef,expn))
        {
            AddPolyn(coef,expn);
        }
        return 0;
    }
    int PopPolyn(float& coef,int& expn)
    {
        if(NULL==m_pSPolynomialHeader) return -1;
        coef=m_pSPolynomialHeader->coef;
        expn=m_pSPolynomialHeader->expn;
        SPolynomial* pTmp=m_pSPolynomialHeader;
        m_pSPolynomialHeader=pTmp->pNextSPolynomial;
        delete  pTmp;
        return 0;
    }
};
int main(int argc, char *argv [])
{
    QCoreApplication a(argc, argv);
    {
    CPolyn b;
    b.AddPolyn(1,2);
    b.AddPolyn(3,3);
    b.AddPolyn(2,4);
    b.AddPolyn(4,4);
    b.AddPolyn(5,6);
    b.AddPolyn(6,5);
    b.AddPolyn(6,5);
    b.AddPolyn(7,7);
    int size=b.PolyLength();
    cout<<"size="<<size<<endl;
    b.PrintPolyn();
    cout<<"Finish it"<<endl;
    }
    return a.exec();
}
时间: 2024-07-31 20:41:20

多项式的构造和加减的相关文章

高斯消元(一)——基础概念和加减消元

如果遇到这种解方程的题目,想把它每个未知数写出公式可不容易,而在不知道解的数据范围的时候,二分枚举什么的和没做没区别,所以这里引入了高斯消元对此进行解答. 高斯消元简直就是为计算机量身打造的解n元一次方程组的利器,虽然在算法竞赛中并不会考像加减消元这种容易的题目,但是这作为它的基础,还是需要讨论一下的. 1.基础概念 高斯消元是指,用第i个式子将它下方的n-i个式子的第i个未知数系数通过加减消元法变为零,然后反过来求解所有未知数的过程. 2.加减消元 为了方便描述,我们将每个式子按照同一个未知数

date的判定和加减

对事件对象的加减判定 <?php $date = new DateTime('2000-01-01'); $date->add(new DateInterval('P10D')); echo $date->format('Y-m-d') . "\n"; ?> 回头来补一补

JAVA中关于日期的转换和加减

1.Date转换成String Date date=new Date("2014-09-09"); String dateString=new SimpleDateFormat("yyyy-mm-dd").format(date); 2.String转换成Date String dateString="2014-09-09"; SimpleDateFormat sf=new SimpleDateFormat("yyyy-mm-dd&qu

多项式艺术:浅谈FFT和NTT算法(未完待续)

什么是多项式? 百度百科说:“由若干个单项式相加组成的代数式叫做多项式.多项式中每个单项式叫做多项式的项,这些单项式中的最高次数,就是这个多项式的次数.” 也就是说,形如的式子,就叫做多项式.这样的式子,也能写作.很显然,多项式加上(或是减上)多项式也是多项式,复杂度是的.但是,如果多项式想要乘上一个多项式,那么也可以,最简单的方法却是的. 不过,FFT算法会告诉你,就够了. 多项式乘法 我们说的,多项式想要乘上一个多项式,那就是多项式乘法,人称“卷积”.我们方才所看到的,被称为多项式的“系数表

1759 加减表达式

题目描述 Description 加减法的运算. 题中数值均为整数,绝对值不超过1000. 输入描述 Input Description 共一行:由整数和加减运算符组成,且每个整数前有若干个+(或-号.或者它们的组合). 输出描述 Output Description 共一行.由"输入表达式"=结果 样例输入 Sample Input +-+-2+-+13--+-4 样例输出 Sample Output +-+-2+-+13--+-3=-15 #include<cstdio>

Matlab基础学习--------多项式及其操作

直接上代码(其中包含详细的实例和注释) %% 多项式及其操作 % 使用poly2sym()函数来构造多项式 % 实例 构造多项式:2*x^6+3*x^5+4*x^4+8*x+1 A=[2 3 4 0 0 8 1]; poly2sym(A) % 结果 ans = 2*x^6+3*x^5+4*x^4+8*x+1 %多项式的根(即多项式表达式=0对应的x的值) % 实例 A=[2 3 4 0 0 8 1]; poly2sym(A) %构造多项式 x=roots(A) % 求多项式的根 % 结果 ans

MATLAB多项式运算

序言 none 正文  1. 多项式的表示 在Matlab中,多项式用一个行向量表示, 行向量的元素值为多项式系数按幂次的降序排列, 如p(x)=x3-2x-5用P=[1,0,-2,-5]表示. 2. 多项式相关的函数和运算 (1) 多项式加减: 两个多项式之间的加减是对应幂次的系数进行加减, 可以直接用系数向量的加减法来得出. (2) 多项式乘法: 两个多项式的乘法用卷积函数conv来实现, 如计算多项式p1(x)=x3-2x-5和p2(x)=2x2+3x+1的积可利用如下代码: p1=[1,

城市规划[多项式、连通图计数]

求出n个点的简单(无重边无自环)无向连通图数目,$n <= 130000$,$mod 1004535809$ 设$f_i$表示i个点的无向连通图数,连通图计数的套路,枚举1号点所在的连通块大小 \begin{array}{rcl}f_n&=&2^{C_n^2}-\sum\limits_{i=1}^{n-1}\binom{n-1}{i-1}f_i 2^{C_{n-i}^2}\\f_n&=&2^{C_n^2}-(n-1)!\sum\limits_{i=1}^{n-1}\f

Adaboost算法结合Haar-like特征

本文主要是介绍自适应提升学习算法(Adaptive Boosting,Adaboost)原理,因为其中涉及到分类器,而分类器往往是基于一些样本特征得到的,所以在此介绍最常用的Adaboost算法结合Haar-like特征.该算法首先在人脸检测中得到广泛运用,而后也被用于其它有关目标检测中. 1.Adaboost算法 1.1 Adaboost算法的前生 在了解Adaboost之前,先了解一下Boosting算法. 回答一个是与否的问题,随机猜测可以获得50%的正确率.若一种方法能获得比随机猜测稍微