【XDOJ2026秋数据结构】730.一元稀疏多项式计算器【Compash个人题解】
730.一元稀疏多项式计算器
问题描述
设计一个一元稀疏多项式的简单计算器,要求能进行加减运算。
问题输入
数据由 3 行构成,第 1 行为 3 个正整数 n,m,t, n 表示第一个多项式的项数,m 表示第二个多项式的项数,t 表示运算类型,0 为加法,1 为减法,每组数据的第 2 行包含 2n 个整数,每两个整数分别表示第一个多项式每一项的系数和指数;第 3 行包含 2m 个整数,每两个整数分别表示第二个多项式每一项的系数和指数。输入每一项按指数从低到高的顺序排列。
问题输出
在一行上以多项式形式输出结果,指数按从低到高的顺序
输入样例
//输入样例
6 3 0
1 0 1 1 -3 2 1 3 1 4 1 5
-1 3 -2 4 1 5
输出样例
//输出样例
1+x-3x^2-x^4+2x^5
#include<iostream>
struct ListNode
{
//系数
int coef;
//指数
int index;
ListNode* next = NULL;
ListNode(int c, int i) : coef(c), index(i) {}
};
void insertListNode(ListNode*& head, int coef, int index)
{
ListNode* newNode = new ListNode(coef, index);
if (head == NULL)
{
head = newNode;
return;
}
ListNode* p = head;
while (p->next)
{
p = p->next;
}
p->next = newNode;
return;
}
int main()
{
int n, m, t;
int maxIndex = 0;
std::cin >> n >> m >> t;
//两个链表
ListNode* l1 = NULL, * l2 = NULL;
for (int i = 0; i < n; i++)
{
int coef, index;
std::cin >> coef >> index;
maxIndex = std::max(maxIndex, index);
insertListNode(l1, coef, index);
}
for (int i = 0; i < m; i++)
{
int coef, index;
std::cin >> coef >> index;
maxIndex = std::max(maxIndex, index);
insertListNode(l2, coef, index);
}
//p,q分别指向l1与l2的节点
ListNode* p = l1, * q = l2;
//l3存放新链表
ListNode* l3 = NULL;
// 合并两个链表
while (p != NULL && q != NULL) {
if (p->index == q->index) {
int result;
if (t == 0) result = p->coef + q->coef;
else result = p->coef - q->coef;
insertListNode(l3, result, p->index);
p = p->next;
q = q->next;
}
else if (p->index < q->index) {
insertListNode(l3, p->coef, p->index);
p = p->next;
}
else {
if (t == 0) insertListNode(l3, q->coef, q->index);
else insertListNode(l3, -q->coef, q->index);
q = q->next;
}
}
// 处理剩余节点
while (p != NULL) {
insertListNode(l3, p->coef, p->index);
p = p->next;
}
while (q != NULL) {
if (t == 0) insertListNode(l3, q->coef, q->index);
else insertListNode(l3, -q->coef, q->index);
q = q->next;
}
p = l3;
bool isZero = true;
bool isFirstPrint = true;
//特殊情况:完全抵消,所有节点系数为0
while (p)
{
//系数非0才有输出
if (p->coef == 0)
{
p = p->next;
continue;
}
else
{
isZero = false;
//系数>0
if (p->coef > 0)
{
if (!isFirstPrint)
{
std::cout << '+';
}
}
//系数<0
else if (p->coef < 0)
{
std::cout << '-';
}
isFirstPrint = false;
}
int coef = abs(p->coef);
int index = p->index;
bool isCoefPrint = true;
bool isIndexPrint = true;
bool isXPrint = true;
//下面考虑特殊情况
//指数为0,只输出系数
if (p->index == 0)
{
isIndexPrint = false;
isXPrint = false;
}
//指数为1,不输出指数
else if (p->index == 1)
{
isIndexPrint = false;
}
//系数为正负1且有x存在的情况,不输出系数
if (abs(p->coef) == 1 && isXPrint)
{
isCoefPrint = false;
}
//开始输出
if (isCoefPrint)
{
std::cout << coef;
}
if (isXPrint)
{
std::cout << 'x';
}
if (isIndexPrint)
{
std::cout << '^' << index;
}
p = p->next;
}
if (isZero) std::cout << '0';
return 0;
}

浙公网安备 33010602011771号