【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;
}
posted @ 2026-10-12 21:22  Compash  阅读(4)  评论(0)    收藏  举报