`
rsljdkt
  • 浏览: 454405 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

多项式类的C++实现(乘法、加法、代入求值)

阅读更多

一、数据结构设计:
    多项式如何表示?这里采用这样的方法:只存储非零系数的项,并且指数递减排列。这样,将简化许多运算。

二、测试平台:VS2010

     参考:《数据结构基础 2nd Edition》

程序代码如下:

#include <iostream>
#include<algorithm>
using namespace std;

class Polynomial;
class Term{//多项式的每一项
	friend Polynomial;
public:
	float coef;//系数
	int exp;//指数
};

class Polynomial{//多项式类
	friend ostream & operator<<(ostream &o,const Polynomial & poly);
public:
	Polynomial();
	Polynomial(const Polynomial & poly);
	~Polynomial();
	Polynomial operator+(const Polynomial & poly);//多项式加法
	Polynomial operator*(const Polynomial & poly);//多项式乘法
	float Eval(float x);//数x代入多项式求值
	void NewTerm(float coef,int exp);//添加一项,若有相同的指数项,则合并
private:
	void insertTerm(const Term & term);//项的有序插入
private:
	Term *termArray;//非零系数项数组
	int capacity;//数组大小
	int terms;//非零系数的项数
};

Polynomial::Polynomial()
{
	this->terms=0;
	this->capacity=10;
	termArray=new Term[this->capacity];
}

Polynomial::Polynomial(const Polynomial & b)
{
	this->terms=0;
	this->capacity=b.capacity;
	termArray = new Term[this->capacity];
	for(int i=0;i<b.terms;i++){
		NewTerm(b.termArray[i].coef,b.termArray[i].exp);
	}
}

Polynomial::~Polynomial()
{
	delete [] termArray;
}

Polynomial Polynomial::operator+(const Polynomial & b)
{
	Polynomial c;
	int aPos=0;
	int bPos=0;
	while(aPos<terms && bPos<b.terms){
		if(termArray[aPos].exp == b.termArray[bPos].exp){
			float coef=termArray[aPos].coef+b.termArray[bPos].coef;
			if(coef)c.NewTerm(coef,termArray[aPos].exp);
			aPos++;bPos++;
		}else if(termArray[bPos].exp < b.termArray[bPos].exp){
			c.NewTerm(b.termArray[bPos].coef,b.termArray[bPos].exp);
			bPos++;
		}else{
			c.NewTerm(termArray[aPos].coef,termArray[aPos].exp);
			aPos++;
		}
	}
	while (aPos < terms){
		c.NewTerm(termArray[aPos].coef,termArray[aPos].exp);
		aPos++;
	}
	while (bPos < b.terms){
		c.NewTerm(b.termArray[bPos].coef,b.termArray[bPos].exp);
		bPos++;
	}
	return c;
}

Polynomial Polynomial::operator*(const Polynomial & b)
{
	Polynomial c;
	for(int i=0; i<terms; i++){
		for(int j=0; j<b.terms; j++){
			float coef = termArray[i].coef*b.termArray[j].coef;
			int exp = termArray[i].exp + b.termArray[j].exp;
			c.NewTerm(coef,exp);
		}
	}
	return c;
}
void Polynomial::NewTerm(float coef, int exp)
{
	if(terms == capacity){
		capacity *= 2;
		Term *tmp = new Term[capacity];
		copy(termArray,termArray+terms,tmp);
		delete [] termArray;
		termArray = tmp;
	}
	Term ATerm;
	ATerm.coef=coef;ATerm.exp=exp;
	insertTerm(ATerm);
}
void Polynomial::insertTerm(const Term & term)
{
	int i;
	for(i=0; i<terms && term.exp<termArray[i].exp; i++){
	}
	if(term.exp == termArray[i].exp){
		termArray[i].coef += term.coef;
		if(!termArray[i].coef){
			for(int j=i; j<terms-1; j++)
				termArray[j]= termArray[j+1];
			terms--;
		}
	}else{
		for(int j=terms-1; j>=i;j--)
			termArray[j+1]=termArray[j];
		termArray[i] = term;
		terms++;
	}
}

float Polynomial::Eval(float x)
{
	float res=0.0;
	for(int i=0;i<terms; i++){
		res += termArray[i].coef * pow(x,termArray[i].exp);
	}
	return res;
}

ostream & operator<<(ostream & o,const Polynomial & poly)
{
	for(int i=0;i<poly.terms-1;i++){
		o<<poly.termArray[i].coef<<"x^"<<poly.termArray[i].exp<<" + ";
	}
	o<<poly.termArray[poly.terms-1].coef<<"x^"<<poly.termArray[poly.terms-1].exp;
	return o;
}

void test()
{
	Polynomial p1;
	p1.NewTerm(3,2);
	p1.NewTerm(2.1,3);

	Polynomial p2;
	p2.NewTerm(1,2);
	p2.NewTerm(1,3);
	p2.NewTerm(5,1);

	cout<<"("<<p1<<") + ("<<p2<<") = "<<p1+p2<<endl;
	cout<<"F(x=2) = "<<(p1+p2).Eval(2)<<endl;
	cout<<"("<<p1<<") * ("<<p2<<") = "<<p1 * p2<<endl;
}

int main()
{
                test();
                system("Pause");
                return 0;
}

 测试结果:

(2.1x^3 + 3x^2) + (1x^3 + 1x^2 + 5x^1) = 3.1x^3 + 4x^2 + 5x^1
F(x=2) = 50.8
(2.1x^3 + 3x^2) * (1x^3 + 1x^2 + 5x^1) = 2.1x^6 + 5.1x^5 + 13.5x^4 + 15x^3
请按任意键继续. . .

 

1
0
分享到:
评论
1 楼 3588 2011-10-27  
error C3861: 'pow': identifier not found

相关推荐

    C++链表基于类实现多项式的加法和乘法

    本话题将探讨如何利用链表类来实现多项式的加法和乘法运算。这些操作在数学计算、数值分析以及计算机图形学等领域有广泛的应用。 首先,我们需要创建一个表示多项式的类。这个类通常会包含一个节点类,用于存储...

    C++实现多项式的加法和乘法

    C++编写,基于单链表实现多项式的加法和乘法

    用链表实现多项式的加法和乘法

    用链表实现多项式的加法和乘法,用输入运算符重载的方法大大简化了链表的创建过程,乘法方面用了数组,主要是利用其线性的优点。

    基于C++的多项式方程计算,可实现加法、减法、乘法、代值、求导等

    在这个基于C++的项目中,我们探讨的是如何实现一个多项式方程计算的系统,它能够执行多项式的加法、减法、乘法操作,以及进行代值计算和求导运算。这些功能对于理解和应用数学概念,特别是在数值分析和算法设计方面...

    用c++实现多项式的加法和乘法的源代码

    在C++编程语言中,实现多项式的加法和乘法是一项基本但重要的任务,尤其对于初学者来说,它可以帮助理解面向对象编程的概念以及如何利用数据结构来表示抽象数学概念。本篇文章将深入探讨如何通过C++实现这个功能,并...

    C++编写的多项式的加法、乘法

    本项目涉及的主题是"C++编写的多项式的加法、乘法",这是一个典型的算法实现,涉及到数学和计算机科学的交叉应用。下面将详细讨论这个主题的知识点。 首先,多项式是数学中的一个重要概念,它由常数、变量和它们的...

    C++ 实现多项式的加法跟乘法

    总结来说,`C++ 实现多项式的加法跟乘法`这个项目涉及了数据结构、类的设计、操作符重载、算法以及单元测试等多个方面的知识。通过实现这个项目,不仅可以加深对C++语言的理解,还可以锻炼问题解决和逻辑思维能力。

    C++实现多项式加法

    本话题主要关注如何使用C++来实现多项式的加法操作,这是一种基本的代数运算,对理解和处理数学问题至关重要。 在C++中实现多项式加法,首先我们需要理解多项式的基本概念。多项式是由常数、变量以及它们之间的加法...

    一元多项式的c++描述加法

    本文将深入探讨如何使用C++来实现一元多项式的链表表示及其加法运算,并通过给出的代码示例进行详细解析。 #### 一元多项式的链表表示 一元多项式可以表示为:\[P(x) = a_nx^n + a_{n-1}x^{n-1} + \cdots + a_1x +...

    C++ 单链表实现多项式乘法

    ### C++ 单链表实现多项式乘法 #### 实习任务及需求分析 本次实习的任务是使用C++编程语言,通过单链表的数据结构来实现两个多项式的相乘操作。这一过程涉及到对多项式的理解、单链表的运用以及算法的设计与优化。...

    多项式的乘法和加法使用C++

    `Poly` 类用于表示多项式,包含了对多项式的基本操作如添加新项、输出多项式以及实现多项式的加法和乘法。 - **成员变量**: - `Term *theList`: 头结点,用于管理多项式的各项。 - **构造函数与析构函数**: - ...

    c++封装的多项式加法器

    该加法器不仅支持基本的多项式运算(包括加法、减法、乘法、求值、求导、求积分),还能够判断两个多项式是否相等,并通过文件操作来存储和读取多项式信息。此外,程序设计时还特别注意了异常处理,以增强程序的健壮...

    用C++链表结构实现多项式的加法,乘法运算

    以上就是用C++链表结构实现多项式加法和乘法运算的基本思路。实际编程时,还需要考虑错误处理、内存管理以及优化等细节。通过这种方式,我们可以高效地处理多项式运算,这对于解决各种数学问题或在数值分析、科学...

    C++多项式运算类

    这个类的设计和实现旨在简化对数学多项式进行操作,例如加法、减法、乘法等。它利用了C++的数据结构概念以及一种内存管理技巧——引用计数。 首先,我们需要理解数据结构是如何在这个上下文中起作用的。在C++中,...

    一元多项式加法和乘法,单链表

    在这个场景中,我们将讨论如何使用C++编程语言来实现一元多项式的加法和乘法操作,并且使用单链表作为数据结构来存储这些多项式。 首先,我们来理解单链表。单链表是一种线性数据结构,其中每个元素(节点)包含...

    任意两个高次多项式的加法和乘法运算课程设计

    本课程设计的主要目标是使用 C++ 语言和数据结构的思想来解决任意两个高次多项式的加法和乘法运算问题。通过对高次多项式的表示、存储和运算的研究,设计一个高效的多项式运算系统。 知识点一:高次多项式的表示和...

    链表多项式的加法与乘法设计报告

    链表多项式的加法与乘法设计报告,含开发思路,内附源码。

    任意两个高次多项式的加法和乘法运算.doc

    该设计的目的是使用C++语言和数据结构思想解决任意两个高次多项式的加法和乘法运算问题。 首先,本设计中使用了单链表和动态链表等关键技术来实现数据结构,并尽可能地节省存储空间和程序的运行时间。同时,开发...

    双向链表及其应用——实现多项式的加法及乘法

    本文将深入探讨双向链表的实现以及它在一项特殊应用中的体现:一元多项式的加法与乘法运算。 首先,我们要理解双向链表的概念。双向链表是一种线性数据结构,每个节点包含两个指针,分别指向其前一个节点和后一个...

Global site tag (gtag.js) - Google Analytics