`

多项式运算

阅读更多
polynomial.h
#ifndef POLYNOMAL_H
#define POLYNOMAL_H

#include<iostream>
using namespace std;
class Term{//多项式结点
public:
    float coef; //系数
    int exp;//指数
    Term *link;
    Term(float c,int e,Term *next=NULL):coef(c),exp(e),link(next){}
    Term* InsertAfter(float c,int e);
    friend ostream& operator<<(ostream&,const Term&);
};

class Polynomial{
public:
    Polynomial(){
        first = new Term(0,-1);
    }
    Polynomial(Polynomial& R);
    int maxOrder();//最大阶数
    Term *getHead()const{
        return first;
    }
    Term* InsertAfter(Term*);
private:
    Term *first;
    friend ostream& operator<<(ostream&,const Polynomial&);
    friend istream& operator>>(istream&,Polynomial&);
    friend Polynomial operator+(Polynomial&,Polynomial&);
    friend Polynomial operator*(Polynomial&,Polynomial&);
};

#endif // POLYNOMAL_H


polynomial.cpp
#include"Polynomial.h"
using namespace std;

/*
  在当前结点再插入一个结点:c的e次方
 */
Term* Term::InsertAfter(float c, int e)
{
    link = new Term(c,e,link);
    return link;
}

ostream& operator<<(ostream& out,const Term& x)
{
    if(x.coef == 0.0){
        return out;
    }
    out << x.coef;
    switch(x.exp){
    case 0:
        break;
    case 1:
        out << "X";
        break;
    default:
        out << "X^" << x.exp;
        break;
    }
    return out;
}

Polynomial::Polynomial(Polynomial &R)
{
    Term* src = R.getHead()->link;
    Term* dest = new Term(0,-1);
    while(NULL!=src){
        dest->InsertAfter(src->coef,src->exp);
        dest = dest->link;
        src = src->link;
    }
}

/*
  最大阶数
  */
int Polynomial::maxOrder()
{
    Term* current = getHead()->link;
    int maxOrder,times=0;
    while(NULL!=current){
        if(times==0){
            maxOrder = current->exp;
            times++;
        }else{
            maxOrder = max(maxOrder,current->exp);
        }
        current = current->link;
    }
    return maxOrder;
}

Term* Polynomial::InsertAfter(Term *term)
{
    Term* current = first;
    while(NULL!=current->link){
        current = current->link;
    }
    current->InsertAfter(term->coef,term->exp);
    return current;
}

istream& operator>>(istream& in,Polynomial& x)
{
    Term* current = x.getHead();
    float c;
    int e;
    while(1){
        cout << "Input a term(coef,exp):" << endl;
        in >> c >> e;
        if(e<0)
            break;
        current = current->InsertAfter(c,e);
    }
    return in;
}

ostream& operator<<(ostream& out,Polynomial& x)
{
    Term* current = x.getHead()->link;
    bool first = true;
    while(NULL!=current){
        if(current->coef>0.0&&(not first)){
            out << "+";
        }
        out << *current;
        first = false;
        current = current->link;
    }
    out << endl;
    return out;
}

Polynomial operator+(Polynomial& p1,Polynomial& p2)
{
    Polynomial p3;
    Term *current1,*current2,*current3;
    current3 = p3.getHead();
    current1 = p1.getHead()->link;
    current2 = p2.getHead()->link;
    float coef;
    while(NULL!=current1&&NULL!=current2){
        if(current1->exp==current2->exp){
            coef = current1->coef+current2->coef;
            p3.InsertAfter(new Term(coef,current1->exp));
            current1 = current1->link;
            current2 = current2->link;
        }else if(current1->exp<current2->exp){
            p3.InsertAfter(new Term(current1->coef,current1->exp));
            current1 = current1->link;
        }else{
            p3.InsertAfter(new Term(current2->coef,current2->exp));
            current2 = current2->link;
        }
    }
    //处理长的那个多项式
    while(NULL!=current1){
        p3.InsertAfter(new Term(current1->coef,current1->exp));
        current1 = current1->link;
    }
    while(NULL!=current2){
        p3.InsertAfter(new Term(current2->coef,current2->exp));
        current2 = current2->link;
    }
    return p3;
}

/*
  先把所有的乘出来,再合并
  */
Polynomial operator*(Polynomial& p1,Polynomial& p2)
{
    Polynomial p3,p4;
    Term *current1,*current2,*current3,*current4;
    current1 = p1.getHead()->link;
    current2 = p2.getHead()->link;
    current3 = p3.getHead();
    current4 = p4.getHead();
    int minExp,currExp;
    bool flag = true;
    while(NULL!=current1){
        current2 = p2.getHead()->link;
        while(NULL!=current2){
            currExp = current1->exp+current2->exp;
            if(flag){
                minExp = currExp;
                flag = false;
            }else{
                minExp = minExp<currExp?minExp:currExp;
            }
            p3.InsertAfter(new Term(current1->coef*current2->coef,
                                     current1->exp+current2->exp));
            current2 = current2->link;
        }
        current1 = current1->link;
    }
    Term t(0,-1);
    int maxExp = p2.maxOrder()+p1.maxOrder();
    for(int i=minExp;i<=maxExp;++i){
        current3 = p3.getHead()->link;
        t.exp = i;
        while(NULL!=current3){
            if(current3->exp==i){
                t.coef += current3->coef;
            }
            current3 = current3->link;
        }
        if(t.coef!=0){
            p4.InsertAfter(new Term(t.coef,t.exp));
            t.coef=0;
        }
    }
    return p4;
}

int main()
{
    Polynomial p1,p2,p3,p4;
    p1.getHead()->InsertAfter(3,-1)->InsertAfter(-2,1)->InsertAfter(3,3);
    p2.getHead()->InsertAfter(2,0)->InsertAfter(2,2)->InsertAfter(4,3)->InsertAfter(3,5);
    cout << "p1:" << p1;
    cout << "p2:" << p2;
    p3 = p1+p2;
    p4 = p1*p2;
    cout << "p1+p2:" <<  p3;
    cout << "p1*p2:" << p4;
}

p1:3X^-1-2X+3X^3
p2:2+2X^2+4X^3+3X^5
p1+p2:3X^-1+2-2X+2X^2+7X^3+3X^5
p1*p2:6X^-1+2X+12X^2+2X^3+1X^4+6X^5+6X^6+9X^8

分享到:
评论

相关推荐

    数据结构简单的多项式运算

    在本实验“数据结构简单的多项式运算”中,我们将关注如何利用数据结构来表示和操作多项式,特别是涉及加法、减法和乘法等基本运算。多项式是一种数学表达式,由常数、变量和它们之间的加法、乘法组合而成,例如 \(2...

    运算符优先算法利用数据结构中的运算符优先算法实现整数的加、减、乘、除、括号的多项式运算,运算表达式以#结尾

    利用数据结构中的运算符优先算法实现整数的加、减、乘、除、括号的多项式运算,运算表达式以#结尾。测试表达式如下运算: "1+(1+2)*(5+25/5)#" 利用数据结构中的运算符优先算法实现整数的加、减、乘、除、括号的...

    C++数据结构课程设计一元多项式运算

    《C++数据结构课程设计:一元多项式运算》 一元多项式运算是数据结构课程中的一个重要实践项目,它涉及到链表数据结构的操作以及基本的数学运算。在这个设计中,开发者利用C++语言实现了一个简易的一元多项式运算...

    数据结构一元多项式运算的实现

    数据结构一元多项式运算的实现,输入两个一元多项式,如:A(x)=15+6x+9x7+3x18, B(x)=4x+5x6+16x7,求 A+B,A-B ,A*B。

    一元多项式运算C语言

    《一元多项式运算C语言》 一元多项式运算在计算机科学中是一个常见的数学问题,尤其是在编程领域,它涉及到数据结构和算法的设计。本文主要探讨如何使用C语言实现一元多项式的运算,特别是求和操作,以及相关的设计...

    数据结构--多项式运算

    本主题聚焦于"数据结构--多项式运算",这是一门南开大学计算机科学与技术课程的作业,由辛运帏老师指导。在此作业中,学生被要求实现多项式的操作,如加法、减法、乘法等,这些操作在数学和算法中具有广泛的应用。 ...

    用C实现一元多项式运算源程序

    《用 C 语言实现一元多项式运算源程序》这篇文档是关于如何使用 C 语言编写一个程序,来处理一元多项式的加法、减法和乘法运算。该程序设计考虑了人机交互界面,使得用户能够方便地输入多项式,并进行相应的计算。 ...

    一元多项式运算(C++链表)

    ### 一元多项式运算(C++链表) 在计算机科学与编程领域中,多项式的表示和处理是一项基本且重要的任务。本篇文章将基于提供的代码片段来深入探讨如何使用链表来实现一元多项式的创建、复制、显示、求值、加法、...

    cj多项式运算器

    "cj多项式运算器"是一款专门用于处理多项式运算的应用软件,它提供了便捷的界面和高效的功能,使得用户能够轻松解决各种数学问题,包括单个多项式的操作以及方程组的求解。这款软件的核心是其强大的算法实现,能够...

    数据结构 多项式运算

    本主题聚焦于“多项式运算”这一特定的数据结构应用,这是计算机科学,尤其是算法和计算理论中的一个重要部分。多项式运算在解决数学问题、科学计算以及工程应用中都扮演着关键角色。 首先,我们来理解什么是多项式...

    多项式运算多项式运算

    在IT领域,多项式运算是一项基础且重要的数学概念,它被广泛应用于计算机科学的多个分支,如数值计算、符号计算、计算机图形学等。这里我们将深入探讨如何在编程环境中实现这些运算,主要针对C语言环境。 首先,...

    多项式运算器/方程组求解器

    在IT行业中,软件开发是一项核心任务,而"多项式运算器/方程组求解器"是这样的一个工具,它专为解决数学问题而设计,尤其是处理多项式运算和线性方程组的求解。这类软件对于学习、研究或工程计算来说非常有价值,...

    基于FPGA的多项式运算器设计.pdf

    多项式运算器是一种能够执行多项式运算的电子设备,多项式在数学中是一类具有固定格式的代数表达式,由变量(通常是x)的非负整数次幂和系数构成。 数字电路实现运算主要有加法、减法、乘法和除法等基本运算。在...

    用链表实现多项式运算

    本项目“用链表实现多项式运算”聚焦于利用链表来表示和操作多项式,涵盖了多项式的基本运算:加法、减法、乘法以及求导。下面将详细讨论这些知识点。 首先,链表是一种非连续存储结构,由一系列节点组成,每个节点...

    一元多项式运算

    一元多项式运算在计算机科学和数学中是一个基础但重要的概念。它涉及到对单变量的多项式进行操作,如加法、乘法等。在本实验中,我们使用线性表来表示一元多项式,这是一个高效且灵活的数据结构。 线性表是一种常见...

    基于C#的多项式运算

    本项目聚焦于“基于C#的多项式运算”,它实现了多项式的基本数学操作,如加法、减法、乘法和除法。在本文中,我们将深入探讨这些运算在C#中的实现方式,以及如何构建用户界面来呈现这些运算结果。 首先,多项式是由...

Global site tag (gtag.js) - Google Analytics