PTA 7-2 一元多项式的乘法与加法运算 (20 分)

本文介绍了一种算法,用于实现一元多项式的乘法与加法运算。通过输入两个多项式的非零项系数和指数,算法能够准确计算并输出它们的乘积与和。详细解析了算法流程,包括如何处理多项式的指数递降排列、系数相加及乘法运算中的指数叠加。

7-2 一元多项式的乘法与加法运算 (20 分)

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

 

#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 1e7+1000;
struct hh{
	int a;
	int x;
}a[MAX],b[MAX],c[MAX],d[MAX],e[MAX];
bool cmp(hh a,hh b){
	return a.x > b.x;
}
int main(){
	int n,m;
	cin >> n;
	for (int i = 0; i < n;i++){
		cin >> a[i].a >> a[i].x;
	}
	cin >> m;
	for (int i = 0; i < m;i++){
		cin >> b[i].a >> b[i].x;
	}
	int index1,index2;
	int num=0;
	for (index1 = 0,index2=0; index1 < n&&index2<m;){//加法
		if(a[index1].x==b[index2].x){
			d[num].a=a[index1].a+b[index2].a;
			d[num++].x=a[index1].x;
			index1++;
			index2++;
		}
		else{
			if(a[index1].x>b[index2].x){
				d[num].a=a[index1].a;
				d[num++].x=a[index1].x;
				index1++;
			}
			else {
				d[num].a=b[index2].a;
				d[num++].x=b[index2].x;
				index2++;
			}
		}
	}
	if(index1!=n){//加法
		for (int i = index1;i < n;i++){
			d[num].a=a[index1].a;
			d[num++].x=a[index1].x;
		}
	}
	if(index2!=m){//加法
		for (int i = index2;i < m;i++){
			d[num].a=b[index1].a;
			d[num++].x=b[index1].x;
		}
	}
	int sum=0;
	for (int i = 0; i < n;i++){//乘法
		for (int j = 0; j < m;j++){
			c[sum].a=a[i].a*b[j].a;
			c[sum++].x=a[i].x+b[j].x;
		}
	}
	sort(c,c+n*m,cmp);//乘法 为了去掉指数相同的
	e[0].a=c[0].a;
	e[0].x=c[0].x;
	int ww=0;
	for (int i = 1; i < sum;i++){//乘法 指数想同的求和
		if(c[i].x==e[ww].x){
			e[ww].a+=c[i].a;
			e[ww].x=c[i].x;
		}
		else {
			e[++ww].a=c[i].a;
			e[ww].x=c[i].x;
		}
	}
	int f=0;//标记是否有输出
	int ji2=0;
	for (int i = 0; i <= ww;i++){//加法求和完成后去掉系数0项
		if(e[i].a==0) continue;
		else {
			e[ji2].a=e[i].a;
			e[ji2++].x=e[i].x;
		}
	}
	for (int i = 0; i < ji2;i++){//输出注意格式
		if(i!=ji2-1) cout << e[i].a << " " << e[i].x << " ",f=1;
		else cout << e[i].a << " " << e[i].x << endl,f=1;
	}
	if(f==0){ //上面没有输出就是0多项式
		cout << 0 << " " << 0 << endl; 
	}
	f=0;
	int ji1=0;
	for (int i = 0; i < num;i++){//乘法求和完成后去掉系数0项
		if(d[i].a==0) continue;
		else {
			d[ji1].a=d[i].a;
			d[ji1++].x=d[i].x;
		}
	}
	for (int i = 0; i < ji1;i++){//输出注意格式
		if(i!=ji1-1) cout << d[i].a << " " << d[i].x << " ",f=1;
		else cout << d[i].a << " " << d[i].x << endl,f=1;
	}
	if(f==0){//上面没有输出就是0多项式
		cout << 0 << " " << 0 << endl; 
	}
	return 0;
}

 

<think>嗯,用户想找关于一元多项式加法运算PTA平台上的实现方法或题解。首先,我得回忆一下PTA上的相关题目,可能是在数据结构部。根据引用[5]提到的SDUT数据结构PTA专题实验二,里面确实有7-8题是关于一元多项式乘法加法运算的,所以应该先考虑这个题目。 用户可能需要具体的代码实现,所以得先确认题目的具体要求。通常这类题目需要处理多项式的输入、存储、相加和输出。根据引用[3]中的讨论,输入可能有两种情况,需要解析系数和指数,并且结果可能需要处理零多项式的情况。比如,输入可能是多个项,每个项有系数和指数,用空格隔,以0 0结束。相加的时候需要合并同类项,按指数降序排列。 接下来,数据结构的选择很重要。链表结构比较适合多项式,因为项数可能不确定,而且需要频繁插入和合并。引用[5]中的题解可能用了链表,比如单链表或者双向链表。需要定义节点结构,包含系数、指数和指向下一个节点的指针。 然后,处理输入的部需要小心。用户提到在引用[3]中,一开始误解了零多项式的输出条件,结果要处理输出0 0的情况。所以代码中必须判断结果是否为空,如果是,输出0 0。同时,输入可能有多项式项,需要正确解析,可能用split方法割字符串,然后逐个处理。 在实现加法时,可以用两个指针别遍历两个多项式,比较当前节点的指数,将较大的项插入结果链表,或者指数相同时系数相加。注意系数为零的情况要跳过,避免无效项。 测试用例方面,比如题目给出的样例输入,需要确保代码能正确处理。例如,第一个多项式可能有项如4x^3和6x^2,第二个多项式-4x^3和-6x^2,相加后结果为0,这时候要输出0 0。或者其他的组合情况,比如不同指数项合并后的正确顺序。 另外,关于代码实现,引用[1]提到用户已经解决了这个问题并给出了完整代码,但可能没有详细说明。所以可能需要根据常见的链表操作方法来构建代码结构,包括创建链表、插入节点、遍历合并等步骤。 最后,需要注意输出格式,每个项之间用空格隔,结尾没有多余空格。对于零多项式的情况,必须正确输出0 0。同时,代码的鲁棒性也很重要,比如处理输入中的多个空格、零系数项等。 总结步骤应该是:定义数据结构,处理输入,实现加法算法,处理输出,考虑边界情况。可能还需要参考PTA题目的具体描述,确保符合题目要求。如果用户需要更详细的代码,可能需要给出具体的链表操作函数,如创建节点、插入排序、合并链表等。</think>### 一元多项式加法运算 PTA 实现方法解析 #### 一、问题理解数据结构设计 1. **输入格式** 多项式输入形式为:$a_nx^e + a_{n-1}x^{e-1} + \dots + a_0x^0$,其中每个项以`系数 指数`形式输入,以`0 0`结束输入。例如: ``` 4 3 6 2 -2 1 0 0 ``` 表示多项式 $4x^3 + 6x^2 - 2x$ 2. **数据结构选择** 使用链表存储多项式,每个节点包含: - 系数(`coef`) - 指数(`expon`) - 指针(`next`) ```python class Node: def __init__(self, coef=0, expon=0): self.coef = coef self.expon = expon self.next = None ``` #### 二、核心算法实现 1. **多项式输入解析** 通过字符串割和循环构建链表: ```python def create_poly(s): nums = list(map(int, s.split())) head = Node() current = head for i in range(0, len(nums)-2, 2): # 忽略结尾的0 0 coef, expon = nums[i], nums[i+1] current.next = Node(coef, expon) current = current.next return head.next # 返回头节点后的第一个有效节点 ``` 2. **多项式相加算法** 双指针遍历两个链表,合并同类项: ```python def add_poly(p1, p2): dummy = Node() current = dummy while p1 and p2: if p1.expon > p2.expon: current.next = Node(p1.coef, p1.expon) p1 = p1.next elif p1.expon < p2.expon: current.next = Node(p2.coef, p2.expon) p2 = p2.next else: coef_sum = p1.coef + p2.coef if coef_sum != 0: current.next = Node(coef_sum, p1.expon) current = current.next p1 = p1.next p2 = p2.next current = current.next current.next = p1 if p1 else p2 return dummy.next ``` 3. **零多项式处理** 在输出前检查链表是否为空: ```python def print_poly(p): if not p: print("0 0") return # ...正常输出逻辑 ``` #### 三、完整代码框架 ```python class Node: def __init__(self, coef=0, expon=0): self.coef = coef self.expon = expon self.next = None def create_poly(s): # 实现输入解析 def add_poly(p1, p2): # 实现多项式相加 def print_poly(p): # 实现格式化输出 # 主程序 s1 = input().strip() # 第一个多项式输入 s2 = input().strip() # 第二个多项式输入 poly1 = create_poly(s1) poly2 = create_poly(s2) result = add_poly(poly1, poly2) print_poly(result) ``` #### 四、测试用例验证 输入样例: ``` 4 3 6 2 -2 1 0 0 5 4 3 3 -6 2 1 0 0 0 ``` 输出应得到: ``` 5 4 7 3 1 0 ``` #### 五、关键注意事项 1. 合并同类项时需判断系数是否为0 2. 输出要求指数从高到低排列 3. 零多项式必须输出`0 0`[^3] 4. 链表操作要正确处理指针连接
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

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

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

打赏作者

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

抵扣说明:

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

余额充值