PAT 一元多项式的乘法与加法运算(链表 c++版)

题目按照指数递减的顺序给出两个一元多项式,输出两个多项式的乘积,还有 和 ,按照指数递减的顺序。

用链表实现一元多项式的乘法与加法运算。

首先来看加法运算

多项式 poly1   x^4 + 3x^3 + 6x

多项式 poly2   6x^5 + 4x^4 + 6

既然用到链表,自然少不了结构体

struct node{
	int coef; //系数
	int expn; //指数
	node* next;
};

实现这加法,只要新创建一个空链表,用两个“游标” cur1,cur2 分别指向两个多项式的头节点,每次找到指数较大的项加入新链表,相应的cur = cur->next,

如果当前的两个对应项的指数相同,就把他们的系数相加, 如果和不为零,就把它加到新链表中。


乘法,模拟乘法即可,每次用poly1的每一项依次乘以 poly2的每一项,再调用求和函数即可。(因为每次求和都保证了当前序列是递减的)


具体来看代码吧。


#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
	int coef; //系数
	int expn; //指数
	node* next;
};
node* creat_list(int n){ //读入链表
	node  *head, *r;
	head = new node;
	r = head; 
	int coef , expn;
	while(n--){
		scanf("%d%d",&coef,&expn);
		node* tmp = new node; //创建临时结点
		tmp->coef = coef;
		tmp->expn = expn;
		r->next = tmp; //临时结点接到链表中
		r = tmp;
	}
	r->next = NULL; //结尾设为 NULL
	return head;
}
node* add_list(node* a,node* b){
	node *r,*fans, *ans;
	node *ha,*hb; //为了防止修改指针本身的值,使用代理指针来完成操作,也就是游标。
	fans = new node;
	ans = fans; //ans 作为fans 的”游标“
	ha = a->next;
	hb = b->next;
	while(ha && hb){
		node* tmp = new node; //建立一次即可
		if(ha->expn > hb->expn){ //每次把指数(exponent)较大的加入链表fans
			tmp->coef = ha->coef;
			tmp->expn = ha->expn;
			ans->next = tmp;
			ans = tmp;
			ha = ha->next;
		}
		else if(ha->expn < hb->expn){
			tmp->coef = hb->coef;
			tmp->expn = hb->expn;
			ans->next = tmp;
			ans = tmp;
			hb = hb->next;
		}
		else{
			int mulOfcoef = (ha->coef)+(hb->coef); //如果指数相同, 就把系数求和。
			if(mulOfcoef!=0){
				tmp->coef = mulOfcoef;
				tmp->expn = ha->expn;
				ans->next = tmp;
				ans = tmp;
			}
			ha = ha->next; //注意这里 即使和为0 ,也要移动“游标”
			hb = hb->next;
		}
	}

	while(ha){
			node* tmp = new node;
			tmp->coef = ha->coef;
			tmp->expn = ha->expn;
			ans->next = tmp;
			ans = tmp;
			ha = ha->next;
	}
	while(hb){
			node* tmp = new node;
			tmp->coef = hb->coef;
			tmp->expn = hb->expn;
			ans->next = tmp;
			ans = tmp;
			hb = hb->next;
	}
	ans->next = NULL; //结尾设为 NULL
	return fans;
}
node* multi_list(node* a,node* b){
	node* ha, *hb;
	node* ans,*fans;
	ha = a->next;
	hb = b->next;
	fans = creat_list(0);
	if(ha == NULL || hb == NULL){
		return fans;
	}
	node* tmp;
	while(ha != NULL){
		tmp = new node;
		ans = tmp;
		hb = b->next; //每次都是从 b 的第一项开始乘;
		while(hb != NULL){
			node* ltmp = new node;
			ltmp->expn = ha->expn + hb->expn; //指数相加,系数相乘
			ltmp->coef = ha->coef * hb->coef;
			hb = hb->next;
			ans->next= ltmp;
			ans = ltmp;
		}
		ans->next = NULL;
		fans = add_list(fans,tmp); //将乘法 分解成一次次的加法
		ha = ha->next;
	}
	return fans;
}
void print_list(node* l){
	node *hc;
	int flag = 0;
	hc = l->next; //指针操作常用,用新创立的节点代替源节点操作
	if(hc == NULL){ //格式控制 。。 真坑!
		printf("0 0");
	}
	while(hc != NULL){
		if(flag)
			printf(" ");
		else
			flag = 1;
		printf("%d %d",hc->coef,hc->expn);
		hc = hc->next;
	}
}
int main(){
	int n;
	scanf("%d",&n);
	node *a = creat_list(n);
	int m;
	scanf("%d",&m);
	node* b = creat_list(m);
	node* c = add_list(a,b);
	node* d = multi_list(a,b);
	print_list(d);
	printf("\n");
	print_list(c);
	printf("\n");
	return 0;
}


C语言版本的戳笔者参考的这个网址C语言版本 ,

对于这个题,开始也用了模拟的方法做了,用到了map,写的较乱。。格式错误wa了无数次

给网上的测试数据吧

样例输入与输出:

序号 输入 输出
1
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
2
2 1 2 1 0
2 1 2 -1 0
1 4 -1 0
2 2
3
2 -1000 1000 1000 0
2 1000 1000 -1000 0
-1000000 2000 2000000 1000 -1000000 0
0 0
4
0
1 999 1000
0 0
999 1000


【结构体模拟版本】

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 100000;
struct node{
	int x, sub;
}poly[maxn],poly2[maxn];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&poly[i].x,&poly[i].sub);
	}
	int m;
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		scanf("%d%d",&poly2[i].x,&poly2[i].sub);
	}
	map<int,int>mp;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			int a=poly[i].x*poly2[j].x;
			int sub = poly[i].sub+poly2[j].sub;
			mp[sub]+=a;
		}
	}
	int sign=0;
	if(!mp.empty()){
		map<int,int>::iterator it= mp.end();
		it--;
		for(;it!=mp.begin();it--){
			if(it->second!=0){
				if(!sign)
					sign=1;
				else
					cout<<" ";
				cout<<it->second<<" "<<it->first;
			}
		}
		if(sign && it->second !=0){
			cout<<" "<<it->second<<" "<<it->first;
		}
		else if(!sign && it->second !=0){
			sign = 1;
			cout<<it->second<<" "<<it->first;
		}
	}
	if(!sign){
		cout<<"0 0";
	}
	cout<<endl;
	int beg=0;
	int beg2=0;
	sign=0;
	while(beg!=n && beg!=m){
		if(poly[beg].sub>poly2[beg2].sub)
		{
			if(!sign)
				sign=1;
			else
				cout<<" ";
			cout<<poly[beg].x<<" "<<poly[beg].sub;
			beg++;
		}
		else if(poly[beg].sub<poly2[beg2].sub){
			if(!sign)
				sign=1;
			else
				cout<<" ";
			cout<<poly2[beg2].x<<" "<<poly2[beg2].sub;
			beg2++;
		}
		else{
			int tmpadd = poly[beg].x + poly2[beg2].x ;
			if( tmpadd == 0){
				
			}
			else{
				if(!sign)
					sign=1;
				else
					cout<<" ";
				cout<<tmpadd<<" "<<poly[beg].sub;
			}
			beg++;
			beg2++;
		}
	}
	while(beg!=n){
		if(!sign)
			sign=1;
		else
			cout<<" ";
		cout<<poly[beg].x<<" "<<poly[beg].sub;
			beg++;
	}
	while(beg2!=m){
		if(!sign)
			sign=1;
		else
			cout<<" ";
		cout<<poly2[beg2].x<<" "<<poly2[beg2].sub;
		beg2++;
	}
	if(!sign)
		cout<<"0 0";
	cout<<endl;
	return 0;
}


你可能感兴趣的:(数据结构,pat,中国大学mooc)