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如果对你有用的话,请点赞并关注,近期不定时更新新内容