题目描述
对于一元多项式 p(x)=p0+p1X+P2x2+ 。 +pnxn ,每个项都有系数和指数两部分,例如p2x2的系数为P2,指数为2。
编程实现两个多项式的相加。
例如 5+x+2x2+3 倍3,-5-x+6x2+4 倍4,两者相加结果:8x2+3 倍3+4 倍4
其中系数5和-5都是x的0次方的系数,相加后为0,所以不显示。x的1次方同理不显示。
可用顺序表或单链表实现。
输入
第1行:输入t表示有t组测试数据
第2行:输入n表示有第1组的第1个多项式包含n个项
第3行:输入第一项的系数和指数,以此类推输入n行
接着输入m表示第1组的第2个多项式包含m项
同理输入第2个多项式的m个项的系数和指数
参考上面输入第2组数据,以此类推输入t组
假设所有数据都是整数
输出
对于每1组数据,先用两行输出两个原来的多项式,再用一行输出运算结果,不必考虑结果全为0的情况
输出格式参考样本数据,格式要求包括:
1.如果指数或系数是负数,用小括号括起来。
2.如果系数为0,则该项不用输出。
3.如果指数不为0,则用符号^表示,例如x的3次方,表示为x^3。
4.多项式的每个项之间用符号+连接,每个+两边加1个空格隔开。
输入样例
2
4
5 0
1 1
2 2
3 3
4
-5 0
-1 1
6 2
4 4
3
-3 0
-5 1
2 2
4
9 -1
2 0
3 1
-2 2
输出样例
5 + 1x^1 + 2x^2 + 3x^3
(-5) + (-1)x^1 + 6x^2 + 4x^4
8x^2 + 3x^3 + 4x^4
(-3) + (-5)x^1 + 2x^2
9x^(-1) + 2 + 3x^1 + (-2)x^2
9x^(-1) + (-1) + (-2)x^1
这道题主要在写让它们相加的函数比较难,但是总体代码结构很清晰(不过不知道这个函数怎么写的话就会卡很久)
#include<iostream>
using namespace std;
class Node{
public:
Node *next;
int data1;
int data2;
Node(){
next=NULL;
}
};
class LinkList{
public:
Node *head;
int len;
LinkList();
~LinkList();
Node *index(int i);
int get1(int i);
int get2(int i);
void insert(int i,int data1,int data2);
void display1();
void add(LinkList &l1);
void del(int i);
};
LinkList::LinkList(){
len=0;
head=new Node();
}
LinkList::~LinkList(){
Node *p=head;
Node *q=new Node();
while(p){
q=p;
p=p->next;
delete q;
}
len=0;
head=NULL;
}
Node *LinkList::index(int i){
Node *p=head;
for(int j=0;j<i;j++){
p=p->next;
}
return p;
}
int LinkList::get1(int i){
return index(i)->data1;
}
int LinkList::get2(int i){
return index(i)->data2;
}
void LinkList::del(int i){
Node *p=index(i-1);
Node *q=index(i);
p->next=q->next;
q=NULL;
len--;
}
void LinkList::insert(int i,int data1,int data2){
Node *p=index(i-1),*q;
q=new Node();
q->data1=data1;
q->data2=data2;
q->next=p->next;
p->next=q;
len++;
}
void LinkList::add(LinkList &l1){
Node *a, *b;
a= head->next ;
b= l1.head->next ;
LinkList l3;//用第三个链表来存储两个多项式相加的结果
Node *p= l3.head ;
while(a&&b){
//cout<<'a';
if(a->data2< b->data2 ){
p->next = new Node();
p= p->next ;
p->data2 = a->data2;
p->data1 = a->data1;
a= a->next ;
}
else if(a->data2> b->data2 ){
p->next = new Node();
p= p->next ;
p->data2 =b->data2 ;
p->data1= b->data1 ;
b= b->next ;
}
else{
int x= a->data1 +b->data1 ;
if(!x){
a= a->next ;
b=b->next ;
// delete s, s1;
}
else{
p->next = new Node();
p= p->next ;
p->data2= b->data2 ;
p->data1 = x;
a= a->next ;
b= b->next;
}
}
}
while(a){
p->next= new Node();
p= p->next;
p->data2= a->data2 ;
p->data1 = a->data1 ;
a= a->next ;
}
while(b){
p->next= new Node();
p= p->next;
p->data2= b->data2 ;
p->data1 = b->data1 ;
b= b->next ;
}
p->next = NULL;
l3.display1();
}
void LinkList::display1(){
Node *p=head->next;
while(p){
if(p->data2==0){
if(p->data1<0){
cout<<"("<<p->data1<<")";
}else
cout<<p->data1;
}
if(p->data2!=0){
if(p->data2>0){
if(p->data1<0){
cout<<"("<<p->data1<<")"<<"x^"<<p->data2;
}else
cout<<p->data1<<"x^"<<p->data2;
}
else{
if(p->data1<0){
cout<<"("<<p->data1<<")"<<"x^"<<"("<<p->data2<<")";
}else
cout<<p->data1<<"x^("<<p->data2<<")";
}
}
if(p->next!=NULL){
cout<<" + ";
}
p=p->next;
}
cout<<endl;
}
int main(){
int n;
int n1,n2;
cin>>n;
int data1,data2;
int data11, data22;
while(n--){
LinkList l1,l2;
cin>>n1;
for(int i=1;i<=n1;i++){
cin>>data1>>data2;
l1.insert(i,data1,data2);
}
cin>>n2;
for(int i=1;i<=n2;i++){
cin>>data11>>data22;
l2.insert(i,data11,data22);
}
l1.display1();
l2.display1();
l1.add(l2);
//l1.display1();
}
}