PTA甲级考试真题练习9——1009 Product of Polynomials

题目

在这里插入图片描述

思路

多项式相乘问题,可以用map,可以用链表,这里使用链表实现

坑点

测试点0!!!系数为0的情况下不输出,注意:这里的系数为0的情况有两种,第一种是本身给的就有系数为0的项,第二种是通过指数相同的项正负抵消后得到的系数为0的项,都要考虑到!!!

代码

typedef struct Node
{
	int exp;       //指数
	double res;    //系数
	struct Node* next;
}Node, * LinkList;

void InitList(LinkList& L)
{
	L = (LinkList)malloc(sizeof(Node));
	L->next = nullptr;
	L->exp = L->res = 0;
	int num;
	cin >> num;
	L->exp = num;
	Node* p = L;
	for (int i = 0; i < num; ++i)
	{
		Node* newNode = (Node*)malloc(sizeof(Node));
		cin >> newNode->exp >> newNode->res;
		newNode->next = p->next;
		p->next = newNode;
		p = newNode;
	}
}

void InsertList(LinkList& C, int exp, double res)
{
	Node* p = C -> next;
	Node* pre = C;
	if (!p)
	{
		Node* newNode = (Node*)malloc(sizeof(Node));
		newNode->exp = exp;
		newNode->res = res;
		newNode->next = C->next;
		C->next = newNode;
		C->exp++;
		return;
	}
	while (p->next!=nullptr)
	{
		if (exp == p->exp)
		{
			p->res += res;
			if (p->res == 0)
			{
				pre->next = p->next;
				free(p);
				C->exp--;
			}
			return;
		}
		if ( (p->exp > exp&& exp > p->next->exp))
		{
			Node* newNode = (Node*)malloc(sizeof(Node));
			newNode->exp = exp;
			newNode->res = res;
			newNode->next = p->next;
			p->next = newNode;
			C->exp++;
			return;
		}
		pre = p;
		p = p->next;
	}
	if (exp == p->exp)
	{
		p->res += res;
		if (p->res == 0)
		{
			pre->next = p->next;
			free(p);
			C->exp--;
		}
		return;
	}
	else
	{
		Node* newNode = (Node*)malloc(sizeof(Node));
		newNode->exp = exp;
		newNode->res = res;
		newNode->next = p->next;
		p->next = newNode;
		C->exp++;
		return;
	}
}

void  mulPol(LinkList& A, LinkList& B,LinkList& C)
{
	C = (Node*)malloc(sizeof(Node));
	C->exp = C->res = 0;
	C->next = nullptr;
	Node* pa = A->next, * pb = B->next;
	while (pa)
	{
		Node* p = pb;
		for (p; p != nullptr; p = p->next)
		{
			int exp = pa->exp + p->exp;
			double res = pa->res * p->res;
			if (fabs(res) >= 1e-5)
			{
				InsertList(C, exp, res);
			}
		}
		pa = pa->next;
	}
}

void PrintPol(LinkList& L)
{
	cout << L->exp;
	Node* p = L->next;
	for (p; p != nullptr; p = p->next)
	{
		printf(" %d %.1lf", p->exp, p->res);
	}
}
int main()
{
	LinkList LA, LB, LC;
	InitList(LA);
	InitList(LB);
	mulPol(LA, LB, LC);
	PrintPol(LC);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值