Calculation Of Polynomial(多项式的运算) C++

本文实现了一个多项式的类,类中重载了多项式的加法、减法、乘法,并且对>> 和 << 进行了重载。

其中多项式的输入(输出)格式为: K  N1 aN1 N2 aN2 ... NK aNK

其中K表示多项式的系数,NK表示第K项的系数aNk相应的系数,并且多项式的系数递减的序列。

  1 //polynomial.h
  2 #include <iostream>
  3 #include <vector>
  4 #include <iomanip>
  5
  6 class polynomial
  7 {
  8 private:
  9     std::vector<double> coefficient;
 10     std::vector<int> radix;
 11 public:
 12     polynomial(){}
 13     polynomial(const polynomial &poly){ *this = poly; }
 14     ~polynomial(){}
 15     friend polynomial operator+(const polynomial &poly1, const polynomial &poly2);
 16     friend polynomial operator-(const polynomial &poly1, const polynomial &poly2);
 17     polynomial& operator+=(const polynomial &poly){ *this = *this + poly; return *this; }
 18     polynomial& operator-=(const polynomial &poly){ *this = *this - poly; return *this; }
 19     friend polynomial operator*(const polynomial &poly1, const polynomial &poly2);
 20     friend std::istream& operator>>(std::istream &is, polynomial &poly);
 21     friend std::ostream& operator<<(std::ostream &os, const polynomial &poly);
 22 };
 23
 24 polynomial operator+(const polynomial &poly1, const polynomial &poly2)
 25 {
 26     polynomial polysum;
 27
 28     int i = 0, j = 0;
 29     while (i<poly1.radix.size() || j<poly2.radix.size())
 30     {
 31         //only poly1
 32         if (i<poly1.radix.size() && j == poly2.radix.size())
 33         {
 34             polysum.radix.push_back(poly1.radix[i]);
 35             polysum.coefficient.push_back(poly1.coefficient[i]);
 36             i++;
 37         }
 38         //only poly2
 39         else if (j<poly2.radix.size() && i == poly1.radix.size())
 40         {
 41             polysum.radix.push_back(poly2.radix[j]);
 42             polysum.coefficient.push_back(poly2.coefficient[j]);
 43             j++;
 44         }
 45         //the radix of poly1 greater than poly2
 46         else if (poly1.radix[i] > poly2.radix[j])
 47         {
 48             polysum.radix.push_back(poly1.radix[i]);
 49             polysum.coefficient.push_back(poly1.coefficient[i]);
 50             i++;
 51         }
 52         //the radix of poly1 smaller than poly2
 53         else if (poly1.radix[i] < poly2.radix[j])
 54         {
 55             polysum.radix.push_back(poly2.radix[j]);
 56             polysum.coefficient.push_back(poly2.coefficient[j]);
 57             j++;
 58         }
 59         //the radix of poly1 equal to poly2
 60         else
 61         {
 62             if (poly1.coefficient[i] + poly2.coefficient[j] != 0)
 63             {
 64                 polysum.radix.push_back(poly1.radix[i]);
 65                 polysum.coefficient.push_back(poly1.coefficient[i] + poly2.coefficient[j]);
 66             }
 67             i++;
 68             j++;
 69         }
 70     }
 71
 72     return polysum;
 73 }
 74
 75 polynomial operator-(const polynomial &poly1, const polynomial &poly2)
 76 {
 77     polynomial negativePoly;
 78
 79     negativePoly = poly2;
 80     for (int i = 0; i < negativePoly.coefficient.size(); i++)
 81         negativePoly.coefficient[i] = -negativePoly.coefficient[i];
 82
 83     return poly1 + negativePoly;
 84 }
 85
 86 polynomial operator*(const polynomial &poly1, const polynomial &poly2)
 87 {
 88     polynomial mul;
 89
 90     int i = 0;
 91     while (i < poly2.coefficient.size())
 92     {
 93         polynomial part = poly1;
 94         double coefficient = poly2.coefficient[i];
 95         int radix = poly2.radix[i];
 96
 97         for (int j = 0; j < part.coefficient.size(); j++)
 98         {
 99             part.radix[j] += radix;
100             part.coefficient[j] *= coefficient;
101         }
102         mul += part;
103         i++;
104     }
105
106     return mul;
107 }
108
109 std::istream& operator>>(std::istream &is, polynomial &poly)
110 {
111     int k;
112     is >> k;
113     for (int i = 0; i<k; i++)
114     {
115         double tmpcoe;
116         int tmprad;
117         is >> tmprad >> tmpcoe;
118         poly.radix.push_back(tmprad);
119         poly.coefficient.push_back(tmpcoe);
120     }
121
122     return is;
123 }
124
125 std::ostream& operator<<(std::ostream &os, const polynomial &poly)
126 {
127     os << poly.radix.size();
128     if (poly.radix.size() != 0)
129         std::cout << " ";
130     for (int i = 0; i<poly.radix.size(); i++)
131     {
132         os << poly.radix[i] << " " << std::fixed << std::setprecision(1) << poly.coefficient[i];
133         if (i != poly.radix.size() - 1)
134             os << " ";
135     }
136
137     return os;
138 }
时间: 2024-08-03 19:17:49

Calculation Of Polynomial(多项式的运算) C++的相关文章

多项式加法运算 使用链表实现

/* 多项式加法运算 使用链表实现 */ #include <iostream> using namespace std; //使用不带头结点的单向链表,按照指数递减的顺序排列 typedef struct PolyNode { int coef; //系数 int expon; //指数 PolyNode *link; //指向下一个节点的指针 }*polynomial, npolynomial; polynomial PolyAdd(polynomial p1, polynomial p2

bzoj 3323: [Scoi2013]多项式的运算.

3323: [Scoi2013]多项式的运算 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 412  Solved: 148[Submit][Status][Discuss] Description 某天,mzry1992 一边思考着一个项目问题一边在高速公路上骑着摩托车.一个光头踢了他一脚,摩托车损坏,而他也被送进校医院打吊针.现在该项目的截止日期将近,他不得不请你来帮助他完成这个项目.该项目的目的是维护一个动态的关于x 的无穷多项式F(x) =

多项式相加运算

 多项式相加运算,使用链表实现,代码仍需要改善,这里先初步做个记录 //实现多项式的表示及相加 by Denis #include <stdio.h> #include <malloc.h> #define ture 1 #define false 0 typedef int ElemType; typedef struct LNode{ ElemType coef; //系数 int expn; //指数 struct LNode *next; }polynomia; pol

SCOI2013 多项式的运算 (BZOJ 3323)

似乎仍然不能附传送门..权限题T_T... 3323: [Scoi2013]多项式的运算 Time Limit: 12 Sec  Memory Limit: 64 MB Description 某天,mzry1992 一边思考着一个项目问题一边在高速公路上骑着摩托车.一个光头踢了他一脚,摩托车损坏,而他也被送进校医院打吊针.现在该项目的截止日期将近,他不得不请你来帮助他完成这个项目.该项目的目的是维护一个动态的关于x 的无穷多项式F(x) = a0 * x^0 + a1 * x^1 + a2 *

BZOJ3323: [Scoi2013]多项式的运算

3323: [Scoi2013]多项式的运算 Time Limit: 12 Sec  Memory Limit: 64 MBSubmit: 128  Solved: 33[Submit][Status] Description 某天,mzry1992 一边思考着一个项目问题一边在高速公路上骑着摩托车.一个光头踢了他一脚,摩托车损坏,而他也被送进校医院打吊针.现在该项目的截止日期将近,他不得不请你来帮助他完成这个项目.该项目的目的是维护一个动态的关于x 的无穷多项式F(x) = a0 * x^0

SCOI2013 多项式的运算

---恢复内容开始--- 又是一道裸数据结构题. 之前受序列操作的蛋疼写法影响,只用一个tag,不知道怎么记,之后看了下别人的,终于领悟要用两个tag,一个add,一个mul,维护相当简单,想清楚就行. 简单说下解法. add mul就是一般的将[L,R]split出来然后打tag. mulx:我将[L,R+1]split出来,然后这一段split成l:[L,R-1],mid:[R,R],r[R+1,R+1],然后把mid的系数加到r上,把mid的系数赋为0,然后merge(mid,l,r);这

一元稀疏多项式加法运算

描述: 设计一个一元稀疏多项式加法运算器,完成多项式a和b相加,建立多项式a+b. 输入说明: 一组输入数据,所有数据均为整数.第1行为2个正整数n,m,其中 n表示第一个多项式的项数,m表示第二个多项式的项数:第2行包含2n个整数,每两个整数分别表示第一个多项式每一项的系数和指数:第3行包含2m个整数,每两个整数分别表示第二个多项式每一项的系数和指数.(注:序列按指数升序排列) 输出说明: 在一行以类多项式形式输出结果,指数按从低到高的顺序.注意,系数值为1的非零次项的输出形式中略去系数1,如

单链表实现多项式的表示及运算

单链表实现多项式的加法运算 最近学习数据结构的线性表,有顺序存储和链表两种,多项式的表示和运算,最能巩固学习成果,现在提供详细代码,来实现多项式的加法运算. 多项式用单链表最为合适,不会造成更多的资源浪费. 如果你恰好用的这本书--数据结构(Java版)(第4版)(叶核亚),推荐你去下面这个链接下载书本源代码,将更助你学的轻松. http://download.csdn.net/detail/wang______jing/9907538 1 //单链表类,实现一些基本单链表的操作 2 publi

基于MATLAB的多项式数据拟合方法研究-毕业论文

摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式曲线拟合的基本理论,对多项式数据拟合原理进行了全方面的理论阐述,同时也阐述了曲线拟合的基本原理及多项式曲线拟合模型的建立.具体记录了多项式曲线拟合的具体步骤,在建立理论的基础上具体实现多项式曲线的MATLAB实现方法的研究,采用MATLAB R2016a的平台对测量的数据进行多项式数据拟合,介绍了M