XDOJ 综合编程练习 133题 一元稀疏多项式计算器

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; 
} 
  • 35
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值