您的位置:首页 > 编程语言 > C语言/C++

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

2015-08-03 20:53 507 查看
本文实现了一个多项式的类,类中重载了多项式的加法、减法、乘法,并且对>> 和 << 进行了重载。

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

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

//polynomial.h
#include <iostream>
#include <vector>
#include <iomanip>

class polynomial
{
private:
std::vector<double> coefficient;
std::vector<int> radix;
public:
polynomial(){}
polynomial(const polynomial &poly){ *this = poly; }
~polynomial(){}
friend polynomial operator+(const polynomial &poly1, const polynomial &poly2);
friend polynomial operator-(const polynomial &poly1, const polynomial &poly2);
polynomial& operator+=(const polynomial &poly){ *this = *this + poly; return *this; }
polynomial& operator-=(const polynomial &poly){ *this = *this - poly; return *this; }
friend polynomial operator*(const polynomial &poly1, const polynomial &poly2);
friend std::istream& operator>>(std::istream &is, polynomial &poly);
friend std::ostream& operator<<(std::ostream &os, const polynomial &poly);
};

polynomial operator+(const polynomial &poly1, const polynomial &poly2)
{
polynomial polysum;

int i = 0, j = 0;
while (i<poly1.radix.size() || j<poly2.radix.size())
{
//only poly1
if (i<poly1.radix.size() && j == poly2.radix.size())
{
polysum.radix.push_back(poly1.radix[i]);
polysum.coefficient.push_back(poly1.coefficient[i]);
i++;
}
//only poly2
else if (j<poly2.radix.size() && i == poly1.radix.size())
{
polysum.radix.push_back(poly2.radix[j]);
polysum.coefficient.push_back(poly2.coefficient[j]);
j++;
}
//the radix of poly1 greater than poly2
else if (poly1.radix[i] > poly2.radix[j])
{
polysum.radix.push_back(poly1.radix[i]);
polysum.coefficient.push_back(poly1.coefficient[i]);
i++;
}
//the radix of poly1 smaller than poly2
else if (poly1.radix[i] < poly2.radix[j])
{
polysum.radix.push_back(poly2.radix[j]);
polysum.coefficient.push_back(poly2.coefficient[j]);
j++;
}
//the radix of poly1 equal to poly2
else
{
if (poly1.coefficient[i] + poly2.coefficient[j] != 0)
{
polysum.radix.push_back(poly1.radix[i]);
polysum.coefficient.push_back(poly1.coefficient[i] + poly2.coefficient[j]);
}
i++;
j++;
}
}

return polysum;
}

polynomial operator-(const polynomial &poly1, const polynomial &poly2)
{
polynomial negativePoly;

negativePoly = poly2;
for (int i = 0; i < negativePoly.coefficient.size(); i++)
negativePoly.coefficient[i] = -negativePoly.coefficient[i];

return poly1 + negativePoly;
}

polynomial operator*(const polynomial &poly1, const polynomial &poly2)
{
polynomial mul;

int i = 0;
while (i < poly2.coefficient.size())
{
polynomial part = poly1;
double coefficient = poly2.coefficient[i];
int radix = poly2.radix[i];

for (int j = 0; j < part.coefficient.size(); j++)
{
part.radix[j] += radix;
part.coefficient[j] *= coefficient;
}
mul += part;
i++;
}

return mul;
}

std::istream& operator>>(std::istream &is, polynomial &poly)
{
int k;
is >> k;
for (int i = 0; i<k; i++)
{
double tmpcoe;
int tmprad;
is >> tmprad >> tmpcoe;
poly.radix.push_back(tmprad);
poly.coefficient.push_back(tmpcoe);
}

return is;
}

std::ostream& operator<<(std::ostream &os, const polynomial &poly)
{
os << poly.radix.size();
if (poly.radix.size() != 0)
std::cout << " ";
for (int i = 0; i<poly.radix.size(); i++)
{
os << poly.radix[i] << " " << std::fixed << std::setprecision(1) << poly.coefficient[i];
if (i != poly.radix.size() - 1)
os << " ";
}

return os;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: