这题最大的问题在于多项式的“ + ”输出,我在网上看到有些答案不全面,但是OJ上一样AC。自己做了一个较全面的方法。
举一个例子,如果多项式有非空的10项,但是前5项系数不为0,后5项系数全为0,那么输出第五项后就不能再输出“ + ”。我们可以用sum=0来记录后面系数是否全都为0.
总结:后面的非空项如果系数有不为0的,就要输出“ + ”,如果全为0,则不能输出“ + ”。
void print(Node *p){ p=p->next; while(p){ if(p->data){ //系数不为0 if(p->ver==0){ //指数为0 if(p->data<0) //系数小于0 cout<<"("<<p->data<<")"; else //系数大于0 cout<<p->data; } else if(p->ver<0){ //指数小于0 if(p->data<0) cout<<"("<<p->data<<")x^"<<"("<<p->ver<<")"; else if(p->data>0) cout<<p->data<<"x^"<<"("<<p->ver<<")"; } else{ //指数大于0 if(p->data<0) cout<<"("<<p->data<<")x^"<<p->ver; else if(p->data>0) cout<<p->data<<"x^"<<p->ver; } int sum=0; //以下是关键代码块。sum记录后面的系数是否全为0 Node *d=p->next; while(d){ if(d->data) sum++; //如果有系数不为0,sum++; d=d->next; } if(sum) //如果后面有系数不为0,则输出“ + " cout<<" + "; } p=p->next; } cout<<endl; }
AC代码如下
#include<iostream>
using namespace std;
class Node{
public:
int data;
int ver;
Node *next=NULL;
};
class List{
int n,m;
Node *head1,*head2,*head3;
public:
List(){
head1=new Node;
head2=new Node;
head3=new Node;
}
void createlist(){
cin>>n;
Node *p1=head1,*s1,*p2=head2,*s2;
for(int i=0;i<n;i++){
s1=new Node;
cin>>s1->data>>s1->ver;
p1->next=s1;
p1=s1;
}
print(head1);
cin>>m;
for(int i=0;i<m;i++){
s2=new Node;
cin>>s2->data>>s2->ver;
p2->next=s2;
p2=s2;
}
print(head2);
}
void addlist(){
Node *p1=head1->next,*p2=head2->next,*p3=head3,*s3;
while(p1&&p2){
s3=new Node;
if(p1->ver==p2->ver){
s3->ver=p1->ver;
s3->data=p1->data+p2->data;
p3->next=s3;
p3=s3;
p1=p1->next;
p2=p2->next;
}
else if(p1->ver<p2->ver){
s3->ver=p1->ver;
s3->data=p1->data;
p3->next=s3;
p3=s3;
p1=p1->next;
}
else{
s3->ver=p2->ver;
s3->data=p2->data;
p3->next=s3;
p3=s3;
p2=p2->next;
}
}
while(p1){
s3=new Node;
s3->ver=p1->ver;
s3->data=p1->data;
p3->next=s3;
p3=s3;
p1=p1->next;
}
while(p2){
s3=new Node;
s3->ver=p2->ver;
s3->data=p2->data;
p3->next=s3;
p3=s3;
p2=p2->next;
}
print(head3);
}
void print(Node *p){
p=p->next;
while(p){
if(p->data){
if(p->ver==0){
if(p->data<0)
cout<<"("<<p->data<<")";
else
cout<<p->data;
}
else if(p->ver<0){
if(p->data<0)
cout<<"("<<p->data<<")x^"<<"("<<p->ver<<")";
else if(p->data>0)
cout<<p->data<<"x^"<<"("<<p->ver<<")";
}
else{
if(p->data<0)
cout<<"("<<p->data<<")x^"<<p->ver;
else if(p->data>0)
cout<<p->data<<"x^"<<p->ver;
}
int sum=0;
Node *d=p->next;
while(d){
if(d->data)
sum++;
d=d->next;
}
if(sum)
cout<<" + ";
}
p=p->next;
}
cout<<endl;
}
};
int main(){
int t;
cin>>t;
while(t--){
List list;
list.createlist();
list.addlist();
}
cout<<endl;
return 0;
}