- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这段代码是关于多项式乘法的。我没有遇到任何错误,只是我想要的是根据度(从低度到高)对术语进行排序。 如果我在//commented 部分的 operator* 中添加条件,它将被打印太多次。我想知道我是否可以使用 m_Polynomial.sort()?如果是如何?如果没有,我可以使用哪些其他方法?
因为它既用于打印多项式又用于打印它们的乘法结果,如果它可以添加到打印函数中就更好了。
此外,如果可以将 Polynomials 的打印样式更改为所需格式(以添加相同次数项的系数)
最少的代码:
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <vector>
using namespace std;
typedef struct Node
{
double cof; // coefficient
int deg; // degree
} Node;
class CPolynomial
{
public:
CPolynomial();
CPolynomial(const string& file);
~CPolynomial();
CPolynomial operator*(const CPolynomial &right);
CPolynomial& operator=(const CPolynomial &right);
void Print() const;
private:
void ReadFromFile(string file);
private:
list<Node> m_Polynomial;
};
int main()
{
CPolynomial p1("P3.txt");
CPolynomial p2("P4.txt");
CPolynomial p3;
p1.Print();
p2.Print();
p3 = p1*p2;
p3.Print();
system("pause");
return 0;
}
CPolynomial::CPolynomial()
{
Node term;
term.cof = 0;
term.deg = 0;
m_Polynomial.push_back(term);
}
CPolynomial::~CPolynomial()
{
m_Polynomial.clear();
}
CPolynomial::CPolynomial(const string& file)
{
ReadFromFile(file);
}
CPolynomial CPolynomial:: operator*(const CPolynomial &right)
{
CPolynomial result;
result.m_Polynomial = m_Polynomial;
for (list<Node>::iterator itr = result.m_Polynomial.begin(); itr != result.m_Polynomial.end(); ++itr)
{
itr->cof = 0;
itr->deg = 0;
}
Node term;
Node termR;
Node temp;
for (list<Node>::const_iterator it = m_Polynomial.begin(); it != m_Polynomial.end(); ++it)
{
for (list<Node>::const_iterator itR = right.m_Polynomial.begin(); itR != right.m_Polynomial.end(); ++itR)
{
term = *it;
termR = *itR;
temp.cof = termR.cof* term.cof;
temp.deg = termR.deg + term.deg;
for (list<Node>::iterator itr = result.m_Polynomial.begin(); itr != result.m_Polynomial.end(); ++itr)
{
if (temp.deg == itr->deg)
{
temp.cof += itr->cof;
itr->cof = 0;
}
// if(temp.deg < it->deg)
//result.m_Polynomial.insert(it, temp);
}
result.m_Polynomial.push_back(temp);
}
}
return result;
}
CPolynomial& CPolynomial:: operator=(const CPolynomial &right)
{
this->m_Polynomial = right.m_Polynomial;
return *this;
}
void CPolynomial::Print() const
{
list<Node>::const_iterator it;
for (it = m_Polynomial.begin(); it != m_Polynomial.end(); it++)
{
if (it->cof == 0)
{
;
}
else
{
if (it->cof > 0)
{
if (it != m_Polynomial.begin()) // if 'it' is not the first term, '+' is not necessary
cout << "+";
}
cout << it->cof;
if (it->deg != 0)
cout << "x^" << it->deg;
}
}
cout << endl;
}
void CPolynomial::ReadFromFile(string file)
{
Node term;
fstream MyFile;
string p;
int num;
MyFile.open(file);
if (!MyFile.is_open())
{
cerr << "Unable to open input file" << endl;
exit(EXIT_FAILURE);
}
else
{
MyFile >> p >> num;
std::list<Node>::iterator it = m_Polynomial.begin();
for (int i = 0; i < num; i++)
{
MyFile >> term.deg >> term.cof;
m_Polynomial.push_back(term);
}
MyFile.close();
}
}
P1.txt
P 8
0 2
5 -3
12 5
2 6
5 7
3 -4
2 9
2 2
P4.txt
P 2
1 4
4 -3
输出
2-3^5+5x^12+6x^2+7x^5-4x^3+9x^2+2x^2 (P1)
4x^1-3x^4 (P2)
8x^1+20x^13-15x^16_12x^9-22x^4+12x^7+68x^3 (P1*P2)
期望的输出:
2+17x^2-4x^3+4x^5+5x^12
4x^1-3x^4
8x^1+68x^3-22x^4+12x^7_12x^9+20x^13-15x^16
最佳答案
你的运算符修改了它的左操作数,为什么?
如果你说 p3 = p1 * p2;
那么修改p1
是错误的,您应该返回一个具有新值的新对象,而不是更改操作数。
一种解决方案是提供 operator*=
作为改变其左操作数的成员函数,然后定义 operator*
作为非成员函数:
CPolynomial operator*(const CPolynomial& lhs, const CPolynomial& rhs)
{
CPolynomial result = lhs;
result *= rhs;
return result;
}
错误似乎在 AddOneTerm
中你在哪里做比较错误。您的循环将在 第一个 位置插入新术语,其中 (term.deg >= it->deg)
但它应该是 last 正确的位置。
您还应该使用 AddOneTerm(term)
而不是 m_Polynomial.push_back(term)
在 ReadFromFile
以确保条款的顺序正确。
您对迭代器的使用也非常困惑:
std::list<Node>::iterator next_it;
next_it = ++it;
现在两个next_it
和 it
已经递增,所以它们都是下一个词。为什么?
我建议更简单一些:
void CPolynomial::AddOneTerm(Node term)
{
auto it = m_Polynomial.begin();
while (it != m_Polynomial.end() && it->deg < term.deg)
{
++it;
}
if (it != m_Polynomial.end() && term.deg == it->deg)
{
it->cof += term.cof;
}
else
{
m_Polynomial.insert(it, term);
}
}
您还可以为 Node
定义比较运算符对象:
bool operator<(const Node& l, const Node& r)
{
return l.deg < r.deg;
}
现在您可以轻松地对 list<Node>
进行排序结构,你可以使用 lower_bound
在 AddOneTerm
中找到合适的位置:
void CPolynomial::AddOneTerm(Node term)
{
auto it = std::lower_bound(m_Polynomial.begin(), m_Polynomial.end(), term);
if (it != m_Polynomial.end() && term.deg == it->deg)
{
it->cof += term.cof;
}
else
{
m_Polynomial.insert(it, term);
}
}
关于c++ - 根据度数对多项式项进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421483/
我想知道当动画结束或被中断时如何在旋转动画中获取当前角度/度数? 我的想法是当点击某个按钮时动画被打断时,旋转将逆时针方向(当前流向是顺时针方向),从被打断时的最后一个角度/度开始。 我试过使用 ap
我正在尝试使用 TYPE_ACCELEROMETER 传感器获取手机角度。我的目标是仅在手机倾斜后获取角度值。它有效,但问题是当我 Handlebars 机正面朝上放在 table 上时,它仍然说 i
以下代码显示为问号而不是度数符号: var airF = Math.round(Number(MDTMOBILE.RWISWeather[i].AirTemp)) + "\u00B0" + "F";
我使用 css 3D-transform rotateY 翻转带有 css transition 的 div。我希望图像翻转一定次数:当转换结束时,我再次触发它直到达到某个计数器值。 我想做什么:当
我正在开发一个 map 应用程序的插件,它有很多类,有大量的单位选项。我觉得我在维护模型内的顺序方面有很好的处理能力。例如,Angle 类具有 Degrees 和 Radians 的属性并自动相互更新
我有一个栅格,是从 netcdf 中获得的(Lambert Conic Conformal projection): library(meteoForecast) wrf_tempor
我在 mapView 的叠加层上有一组项目。 我知道大多数对象的顶部/底部/左侧/右侧位置。 我想使用 zoomToSpan() 方法来放大该区域。 用这种方法计算纬度/经度的正确方法是什么? 最佳答
给你一个具有 100 万个顶点的最大度数为 4 的简单图。 我们想找到一个最大独立子集。 一般情况下是NP难的。 度数最大为 4 的事实是否提供了计算它的有效解决方案? 最佳答案 进一步阅读维基百科页
我是一名优秀的程序员,十分优秀!