題目如下:
對于一元多項式p(x)=p0+p1x+p2x2+…+pnxn,每個項都有系數和指數兩部分,例如p2x2的系數為p2,指數為2。
編程實作兩個多項式的相加。
例如5+x+2x2+3x3,-5-x+6x2+4x4,兩者相加結果:8x2+3x3+4x4
其中系數5和-5都是x的0次方的系數,相加后為0,所以不顯示。x的1次方同理不顯示。
要求用單鏈表實作。
案例輸入:
4
5 0
1 1
2 2
3 3
4
-5 0
-1 1
6 2
4 4
輸出:
5 + 1x^1 + 2x^2 + 3x^3
(-5) + (-1)x^1 + 6x^2 + 4x^4
8x^2 + 3x^3 + 4x^4
#include <iostream>
using namespace std;
class CPloy{
public:
int E,factor;
CPloy *next;
CPloy(){next=NULL;}
};
class CLinkPloy{
public:
CPloy *head;
int len;
CLinkPloy();
~CLinkPloy();
void init(int n);
void print();
void LMerge(CLinkPloy &cl);
};
CLinkPloy::CLinkPloy(){
head=new CPloy;
len=0;
}
CLinkPloy::~CLinkPloy(){
CPloy *p=head,*q;
while(p){
q=p;
p=p->next;
delete q;
}
head=NULL;
len=0;
}
void CLinkPloy::init(int n){
int f,e;
len=n;
CPloy *p=head;
for(int i=0;i<len;i++){
CPloy *q=new CPloy;
cin>>f>>e;
q->E=e;
q->factor=f;
p->next=q;
p=q;
}
}
void CLinkPloy::print(){
CPloy *p=head->next;
if(p){
if(p->factor > 0 && p->E==0 )
cout<<p->factor;
else if(p->factor < 0 && p->E==0 )
cout<<"("<<p->factor<<")";
else if(p->factor >0 &&p->E>0)
cout<<p->factor<<"x^"<<p->E;
else if(p->factor <0&& p->E>0)
cout<<p->factor<<")x^"<<p->E;
else if(p->factor >0 && p->E<0)
cout<<p->factor<<"x^("<<p->E<<")";
else if(p->factor <0&& p->E<0)
cout<<"("<<p->factor<<")x^("<<p->E<<")";
p=p->next;
}
while(p){
if(p->factor >0 && p->E>0)
cout<<" + "<<p->factor<<"x^"<<p->E;
else if(p->factor <0&& p->E>0)
cout<<" + ("<<p->factor<<")x^"<<p->E;
else if(p->factor > 0 && p->E==0 )
cout<<" + "<<p->factor;
else if(p->factor < 0 && p->E==0 )
cout<<" + ("<<p->factor<<")";
else if(p->factor >0 && p->E<0)
cout<<" + "<<p->factor<<"x^("<<p->E<<")";
else if(p->factor <0&& p->E<0)
cout<<" + ("<<p->factor<<")x^("<<p->E<<")";
p=p->next;
}
cout<<endl;
}
void CLinkPloy::LMerge(CLinkPloy &cl){
CPloy *p=head->next,*q=cl.head->next;
CPloy *r=head;
//CPloy *s=new CPloy;
while(p&&q){
CPloy *s=new CPloy;
if(p->E == q->E){
s->E=p->E;
s->factor=p->factor+q->factor;
if(p->factor+q->factor!=0){
r->next=s;
r=s;
}
p=p->next;
q=q->next;
}else if(p->E < q->E){
s->E=p->E;
s->factor=p->factor;
r->next=s;
r=s;
p=p->next;
}else if(p->E > q->E){
s->E=q->E;
s->factor=q->factor;
r->next=s;
r=s;
q=q->next;
}
}
r->next= p?p:q;
}
int main(){
int t,n,m;
cin>>t;
while(t--){
CLinkPloy cl1,cl2;
cin>>n;
cl1.init(n);
cl1.print();
cin>>m;
cl2.init(m);
cl2.print();
cl1.LMerge(cl2);
cl1.print();
}
return 0;
}
uj5u.com熱心網友回復:
給你改了一下merge和print函式,自己對比一下void CLinkPloy::print(){
CPloy *p=head; //這里從head開始
bool flag = false;
while(p){
if (flag) cout<<" + ";
if(p->factor >0 && p->E>0) {
cout<<p->factor<<"x^"<<p->E;
flag = true;
}
else if(p->factor <0&& p->E>0) {
cout<<"("<<p->factor<<")x^"<<p->E;
flag = true;
}
else if(p->factor > 0 && p->E==0 ) {
cout<<p->factor;
flag = true;
}
else if(p->factor < 0 && p->E==0 ) {
cout<<"("<<p->factor<<")";
flag = true;
}
else if(p->factor >0 && p->E<0) {
cout<<p->factor<<"x^("<<p->E<<")";
flag = true;
}
else if(p->factor <0&& p->E<0) {
cout<<"("<<p->factor<<")x^("<<p->E<<")";
flag = true;
}
p=p->next;
}
cout<<endl;
}
void CLinkPloy::LMerge(CLinkPloy &cl){
CPloy *p=head,*q=cl.head; //這里從head開始
CPloy *r=head; //r用于記錄p的上一個節點
//CPloy *s=new CPloy;
while(p&&q){
//CPloy *s=new CPloy;
if(p->E == q->E){
//s->E=p->E;
p->factor=p->factor+q->factor;
//if(p->factor+q->factor!=0){
// r->next=s;
//r=s;
//}
r = p;
p=p->next;
q=q->next;
}else if(p->E < q->E){
CPloy *s=new CPloy; //拷貝q,并插入p中
//s->E=p->E;
//s->factor=p->factor;
s->E=q->E;
s->factor=q->factor;
r->next=s;
r=s;
//p=p->next;
s->next = p;
q=q->next;
}else if(p->E > q->E){
//s->E=q->E;
//s->factor=q->factor;
//r->next=s;
//r=s;
//q=q->next;
r = p;
p = p->next;
}
}
r->next= p?p:q;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/139060.html
標籤:新手樂園
上一篇:STM32MP1系列教程連載-華清遠見FS-MP1A開發板使用
下一篇:HALCON匯出C#,if (HDevWindowStack.IsOpen()) 這個判斷陳述句條件無法成立為什么?
