XDOJ 综合编程练习 133题 一元稀疏多项式计算器
题目内容
m n t
输入样例
6 2 0
1 0 1 1 1 2 1 3 1 4 1 5
-1 3 -1 4
输出样例
1+x+x^2+x^5
判定规则: 忽略首尾空白 忽略空行 忽略大小写 数据之间只保留一个空白
思路
总体思路
先分别读入两行多项式并分别存储于a, b两处, 然后对b的每一项B, 在a的各项A中遍历, 比较是否有指数和B一样的A, 若有, 则将两项合并; 若无, 则根据t的值判断:
- 若t为0, 即一二行求和, 则将该项B存储至a的末尾
- 若t为1, 即一二行做差, 则将B的系数取反后再存储至a的末尾 [重要]
再之后, 对a中的元素, 按照指数大小升序排列, 再考虑输出
- 两项之间是否需要补上一个+号或者-号
- 在什么时候应该补上+号
- 若系数为0, …
- 若系数不为0且指数为1, …
- 若系数的绝对值为1, …[重要]
- 若…
然后就好了
我们应该做的事
-
存储每一项的系数和指数, 这可以用结构体解决
-
存储两个多项式, 并且需要支持在后面添加元素, 这可以用stl vector解决
-
按照指数比较多项式, 这可以在结构体中重载 < 运算符, 配合 stl sort()解决
当然也可以自定义一个比较函数, 都行
如果还是不能AC的话
试试这组数据
输入:
4 3 1
6 -3 -1 1 4 2 -1 9
-6 -3 5 2 7 15
应该输出:
12x^-3-x-x^2-x^9-7x^15
代码
如果你看到这里了, 那就点个赞吧, 谢谢啦😝
#include <bits/stdc++.h>
using namespace std;
struct dxs{//多项式...的拼音
int ratio = 0;//系数
int index = 0;//指数
bool operator < (const dxs& s){//重载 < 运算符
return index < s.index;
}
};
int printDXS(dxs in, int pos){//输出一项; 返回0代表该项系数为0; 返回1代表输出了一项
if(in.ratio == 0)
return 0;
else{
if(in.ratio > 0 && pos != 0)
cout << "+";
if(in.index == 0){
cout << in.ratio;
return 1;
}
else if(in.index == 1){
if(in.ratio == 1){
cout << "x";
return 1;
}
if(in.ratio == -1){
cout << "-x";
return 1;
}
cout << in.ratio << "x";
return 1;
}
else{
if(in.ratio == 1){
cout << "x^" << in.index;
return 1;
}
if(in.ratio == -1){
cout << "-x^" << in.index;
return 1;
}
cout << in.ratio << "x^" << in.index;
return 1;
}
}
}
void merge(dxs& a, dxs& b, int op){//合并同类项, 传引用来修改实参
if(op == 0)
a.ratio = a.ratio + b.ratio;
else
a.ratio = a.ratio - b.ratio;
}
int main(){
int n, m, t;
cin >> n >> m >> t;
vector<dxs> a, b;//第一行, 第二行
for(int i = 0;i < n;i++){
dxs t;
cin >> t.ratio >> t.index;
a.push_back(t);
}
for(int i = 0;i < m;i++){
dxs t;
cin >> t.ratio >> t.index;
b.push_back(t);
}
for(int y = 0;y < m;y++){
for(int x = 0;x < n;x++){
if(b[y].index == a[x].index){//指数相等
merge(a[x], b[y], t);
goto END;
}
}
//重要
if(t == 1)
b[y].ratio = -b[y].ratio;//系数取反
a.push_back(b[y]);
END:;
}
int outCnt = 0;//记录输出了多少项, 毕竟 首项前面不能有+号
sort(a.begin(), a.end());
for(unsigned int i = 0;i < a.size();i++){
if(printDXS(a[i], outCnt))
outCnt++;
}
return 0;
}