一元多项式的加/减法运算
- 问题描述
假设2个稀疏一元多项式分别由带头结点的有序单链表A和B存储(指数项递增有序)。现要求设计一个算法,实现稀疏一元多项式的加减法计算。要求使用A和B的原存储空间(运算后B不再存在,A链表中保存结果多项式)。输入中的单链表的长度不得在计算算法中利用,仅作为建表使用。
注意:加/减法计算后,如某一项的结果系数为0,则该项要从多项式链表中删除。 - 输入说明
第一行:加/减法选择(0:加法 1:减法)
第二行:一元多项式A的项数
第三行:一元多项式A的各项的系数(系数之间以空格分隔)
第四行:一元多项式A的各项的指数(指数之间以空格分隔)
第五行:一元多项式B的项数
第六行:一元多项式B的各项的系数(系数之间以空格分隔)
第七行:一元多项式B的各项的指数(指数之间以空格分隔)
如果A或B的项数为0,则认为输入的多项式只包含数字“0”,即系数为0,指数也为0。 - 输出说明
第一行:多项式A的第一项的系数、指数(以空格分隔)
第一行:多项式A的第二项的系数、指数(以空格分隔)
…
第n行:多项式A的第n项的系数、指数(以空格分隔) (假设多项式A的项数为n)
(空行)
第一行:多项式B的第一项的系数、指数(以空格分隔)
第一行:多项式B的第二项的系数、指数(以空格分隔)
…
第m行:多项式B的第m项的系数、指数(以空格分隔) (假设多项式B的项数为m)
(空行)
第一行:加/减法计算后,结果多项式A的第一项的系数、指数(以空格分隔)
第一行:加/减法计算后,结果多项式A的第二项的系数、指数(以空格分隔)
…
第p行:加/减法计算后,结果多项式A的第n项的系数、指数(以空格分隔) (假设结果多项式的项数为p)
(多项式之间以空行分隔,如果多项式只包含“0”,则相应的多项式输出"0 0",不包含引号。) - 输入范例
1
6
7 3 -22 9 5 -8
0 1 7 8 17 100
3
8 22 -9
1 7 8
- 输出范例
7 0
3 1
-22 7
9 8
5 17
-8 100
8 1
22 7
-9 8
7 0
-5 1
-44 7
18 8
5 17
-8 100
- AC代码参考
#include<bits/stdc++.h>
using namespace std;
struct node{
int xs;
int zs;
node *next;
};
node *create(int n){
node *head = new node;
node *p = head;
for(int i=0;i<n;i++){
node *s = new node;
cin>>s->xs;
p->next = s;
p = s;
}
p->next = NULL;
p = head->next;
while(p){
cin>>p->zs;
p = p->next;
}
return head;
}
node *add(node *A,node *B){
node *p = B->next,*q,*r;
while(p){
r = p->next;
q = A->next;
while(q){
if(q->zs==p->zs){
q->xs = p->xs+q->xs;
break;
}
q =q->next;
}
if(!q){
q = A;
while(q->next&&q->next->zs<p->zs) q = q->next;
p->next = q->next;
q->next = p;
}
p = r;
}
return A;
}
node *reduce(node *A,node *B){
node *p = B->next,*q,*r;
while(p){
r = p->next;
q = A->next;
while(q){
if(q->zs==p->zs){
q->xs = q->xs - p->xs;
break;
}
q =q->next;
}
if(!q){
q = A;
while(q->next&&q->next->zs<p->zs) q = q->next;
q->xs = (0-q->xs);
p->next = q->next;
q->next = p;
}
p = r;
}
return A;
}
node *norm(node *head){
node *p = head->next,*pre = head;
while(p){
if(p->xs==0){
pre->next = p->next;
p = pre->next;
}else{
pre = p;
p = p->next;
}
}
return head;
}
void display(node *head){
head = norm(head);
node *p = head->next;
if(!p) cout<<"0 0"<<endl;
while(p){
cout<<p->xs<<" "<<p->zs<<endl;
p = p->next;
}
cout<<endl;
}
int main(){
int op,n,m;
cin>>op;
node *A = new node;
node *B =new node;
cin>>n;
A = create(n);
cin>>m;
B = create(m);
display(A);
display(B);
node *C = new node;
if(op==0){
C = add(A,B);
}else{
C = reduce(A,B);
}
display(C);
return 0;
}