XDOJ-一元稀疏多项式计算器

XDOJ-一元稀疏多项式计算器

标题
一元稀疏多项式计算器

类别
综合

时间限制
2S

内存限制
1000Kb

问题描述
一元 n 次多项式𝑝0𝑋𝑒0 + 𝑝1𝑋𝑒1 + ⋯ + 𝑝𝑖𝑋𝑒𝑖 + ⋯ + 𝑝𝑛𝑋𝑒𝑛 项数较少时成为一元稀疏多项式,例如:3 + 6𝑋3 − 2𝑋8 + 12𝑋20是一个一元稀疏多项式。设计一个一元稀疏多项式计算器程 序完成两个一元稀疏多项式的加减法,输出结果多项式的各项系数和指数。

输入说明
输入数据第 1 行为 3 个正整数 n,m,t。其中 n 表示第一个多项式的项数,m 表示第二个
多项式的项数,t 表示运算类型,0 为加法,1 为减法。数据的第 2 行包含 2n 个整数,每两
个整数分别表示第一个多项式每一项的系数和指数;第 3 行包含 2m 个整数,每两个整数分
别表示第二个多项式每一项的系数和指数。两个多项式的每项是按照指数递增的形式给出的,
例如对于多项式3 + 6𝑋3 − 2𝑋8 + 12𝑋20,对应的输入为 3 0 6 3 -2 8 12 20

输出说明
运算结果按指数从低到高的顺序在以多项式形式(见输出样例)输出结果,注意系数为负数
时输出减号,系数为 0 时不输出该项,指数为 1 时不输出指数。

输入样例
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
(编辑原因,此处x^5之间没有那个空格)

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>//该库中含有下文用到的swap函数,不用自己手写swap了
using namespace std;
struct num//想了想还是用结构体吧
{
	int x, y;
};
int main()
{
	num sj1[200], sj2[100];//2个结构体数组,sj意为数据
	bool result = false;
	int n, m, t,i,j,a;//n,m,t如题所示,i,j控制循环
	cin >> n >> m >> t;
	a = n;
	for (i = 0; i < n; i++)
	{
		cin >> sj1[i].x >> sj1[i].y;
	}
	for (i = 0; i < m; i++)
	{
		cin >> sj2[i].x >> sj2[i].y;
	}
	for (i = 0; i < n; i++)
		{
			for (j = 0; j < m; j++)
			{
				if (sj1[i].y == sj2[j].y)思路是将指数相同的项系数相加放入sj1结构体中
				{
					if (t == 0)//加法运算
					{
						sj1[i].x += sj2[j].x;
					}
					else
					{
						sj1[i].x -= sj2[j].x;//减法运算
					}
					sj2[j].x = 0;//将对应的sj2中x置零
					break;//减少不必要的循环次数
				}
				
			}
		}
		for (i = 0; i < m; i++)
		{
			if (sj2[i].x != 0)//经历上面的循环过后,指数相同的项已经处理完毕,这些项的系数已经置零,下面来寻找系数不为零的项,将其加入到sj1的后面
			{
				if (t == 0)
				{
					sj1[a].x = sj2[i].x;//将sj2系数不为零的项加入到sj1的后面,此处也要注意t值
				}
				else 
				{
					sj1[a].x = -sj2[i].x;
				}
				sj1[a].y = sj2[i].y;
				a++;
			}
		}
		for (i = 0; i < a - 1; i++)//sj1目前已经包含所有项,但添加后面那一部分时,指数可能比sj1前面的值小,此处用冒泡排序,从小到大排下sj1,排完后即按照升幂顺序
		{
			for (j = 0; j < a - 1 - i; j++)
			{
				if (sj1[j].y > sj1[j + 1].y)
				{
					swap(sj1[j], sj1[j + 1]);
				}
			}
		}
		for (i = 0; i < a; i++)//后面写的太乱了,不忍直视,目的是处理指数为0和指数为1,系数为0,系数为1和系数为-1,以及系数大于1时输出+,还要注意输出第一项如果系数为正,+号不用输出,总之很烦
		{
			if (sj1[i].x == 0)
			{
				continue;
			}
			else if(sj1[i].y==0)
			{
				cout << sj1[i].x;
				result = true;
			}
			else
			{
				if (sj1[i].y == 1)
				{
					if (result)
					{
						if (sj1[i].x > 1)
						{
							cout << "+" << sj1[i].x << "x";
						}
						else if (sj1[i].x == 1)
						{
							cout << "+x";
						}
						else if (sj1[i].x == -1)
						{
							cout << "-x";
						}
						else
						{
							cout << sj1[i].x << "x";
						}
					}
					else
					{
						if (sj1[i].x > 1)
						{
							cout << sj1[i].x << "x";
						}
						else if (sj1[i].x == 1)
						{
							cout << "x";
						}
						else if (sj1[i].x == -1)
						{
							cout << "-x";
						}
						else
						{
							cout << sj1[i].x << "x";
						}
						result = true;
					}
				}
				else
				{
					if (sj1[i].x > 1)
					{
						if (result)
						{
							cout << "+" << sj1[i].x << "x^" << sj1[i].y;
						}
						else
						{
							cout << sj1[i].x << "x^" << sj1[i].y;
							result = true;
						}
					}
					else if (sj1[i].x == 1)
					{
						if (result)
						{
							cout << "+x^" << sj1[i].y;
						}
						else
						{
							cout << "x^" << sj1[i].y;
							result = true;
						}
					}
					else if (sj1[i].x == -1)
					{
						if (result)
						{
							cout << "-x^" << sj1[i].y;
						}
						else
						{
							cout << "-x^" << sj1[i].y;
							result = true;
						}
					}
					else
					{
						cout << sj1[i].x << "x^" << sj1[i].y;
					}
				}
				
			}

		}
	return 0;
}

应该有180行代码,感觉有点繁琐,如果有简单的,欢迎讨论交流
思路都在代码中注释了,下方不再赘述
ps:如有错误敬请指正,欢迎评论区讨论或私信
邮箱:1654407501@qq.com如果对你有用的话,请点赞并关注,近期不定时更新新内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怡人蝶梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值