ACM 多项式加法

来源:互联网 发布:日本蜡烛图技术知乎 编辑:程序博客网 时间:2024/05/17 22:42

多项式加法

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:1458            测试通过:152

描述

线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。

现给两个一元整系数多项式,请求解两者之和。

输入

两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序,每一组结束行为

0 -1

输出

三组数据,前两组为一元整系数多项式,最后一组为两个多项式的和。

一元整系数多项式输出形式如下:

1)多项式项4x输出为4X

2)多项式项4x2输出为4X^2

3)第一项系数为正数时,加号不要输出

4)除常系数项外,项系数为1不显式输出,-1输出为-

例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为 +4X^3-1X^2+1X-1

样例输入

3 14
-8 8
6 2
2 0
0 -1
2 10
4 8
-6 2
0 -1

样例输出

3X^14-8X^8+6X^2+2
2X^10+4X^8-6X^2
3X^14+2X^10-4X^8+2

提示

该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,请慎重解答。

题目来源

CHENZ


注意点:输出格式,相加判断指数相不相同,特别注意如果相加为0的情况,否则会出现内存错误(坑!)

用的是C的单链表

贴上自己的代码


#include<stdio.h>#include<stdlib.h>//输入2组数据 #define LEN sizeof(struct node)struct node{int a;int b;struct node *next;};// Inputstruct node *Input(){struct node *head,*p,*tail;head=NULL,tail=NULL;int x,y;while(scanf("%d %d",&x,&y) && (x != 0 || y != -1)){if(x == 0) continue; // 去除项数为0的if(tail != NULL && y == tail->b) { // 相同指数tail->a += x;continue;}p=(struct node*)malloc(LEN);p->a = x; p->b = y;if(head==NULL) head=p;else           tail->next=p;tail=p;}tail->next=NULL;return head;}//Printvoid Print(struct node *head){struct node *p;p=head;if(head!=NULL){do{if(p == head){if(p->b == 1) {if(p->a >0) {if(p->a == 1)printf("X");else printf("%dX",p->a);}else {if(p->a == -1)printf("-X",p->b);elseprintf("%dX",p->a,p->b);}}else { // head : p->b != 1if(p->a >0) {if(p->a == 1)printf("X^%d",p->b);else printf("%dX^%d",p->a,p->b);}else {if(p->a == -1)printf("-X^%d",p->b);elseprintf("%dX^%d",p->a,p->b);}}}// not headelse if(p->b != 1 && p->b !=0) {if(p->a > 0) {if(p->a == 1) printf("+X^%d",p->b);elseprintf("+%dX^%d",p->a,p->b);}else {if(p->a == -1) printf("-X^%d",p->b);elseprintf("%dX^%d",p->a,p->b);}}else if(p->b == 1 ) {if(p->a > 0) {if(p->a == 1)printf("+X");elseprintf("+%dX",p->a);}else {if(p->a ==-1)printf("-X");elseprintf("%dX",p->a);}}else if(p->b == 0 ) {if(p->a > 0)printf("+%d",p->a);else printf("%d",p->a);}p=p->next;}while(p!=NULL);}printf("\n");}int main(){bool tag = true; // x + -x = 0 !!!struct node *head1,*head2;head1 = Input();Print(head1);head2 = Input();Print(head2);//struct node *head,*p,*tail; // 新建一个链表head=NULL,tail=NULL;struct node *p1,*p2; p1 = head1; p2 = head2;while(p1 != NULL && p2 != NULL) { if(p1->b > p2->b) { //p1指数 >p2指数 添加p1 p=(struct node*)malloc(LEN); // !!!tag = false;p->a = p1->a; p->b = p1->b;if(head==NULL) head=p;else           tail->next=p;tail=p;p1 = p1->next;}else if(p1->b == p2->b) {int tmp = p1->a + p2->a; // 判断指数是否为0if(tmp != 0) {p=(struct node*)malloc(LEN); // !!!tag = false;p->a = p1->a + p2->a; p->b = p1->b;if(head==NULL) head=p;else           tail->next=p;tail=p;}p1 = p1->next; p2 = p2->next;}else { //p2指数 > p1指数  插入p2p=(struct node*)malloc(LEN); // !!!tag = false;p->a = p2->a; p->b = p2->b;if(head==NULL) head=p;else           tail->next=p;tail=p;p2 = p2->next;}}// 加上尾巴 p1 p2考虑全if(p1 != NULL) {tail->next = p1;}else if(p2 != NULL){tail->next = p2;}else if(!tag)tail->next = NULL;if(!tag)Print(head); elseprintf("0\n");return 0;}

另外C++ 代码 
带一个空的表头结点,方便在最前面插入删除。


#include<iostream>   using namespace std;   typedef struct node{   int a;   int b;   struct node *next;     }Node;   int a,b;   bool tag=true;   void print(Node *head)   {   Node *p=head->next;   while(p!=NULL)   {   if(p==head->next)   {   if(p->a!=1)   {   if(p->a==-1)   {   cout<<"-";    }       else  {   cout<<p->a;    }   }    }    else  {   if(p->a>0)   {   cout<<"+";   if(p->a!=1)   {   cout<<p->a;    }   }    else  {   if(p->a!=-1)   {   cout<<p->a;   }    else  {   cout<<"-";    }   }   }   if(p->b!=0)   {   cout<<"X";   }   else  {   if(p->a==1||p->a==-1)   {   cout<<"1";    }   p=p->next;   continue;    }   if(p->b!=1)   {   cout<<"^"<<p->b;    }   p=p->next;   }   cout<<endl;   }   int main(){   Node *head[2],*head1,*p1,*p2,*k;   for(int i=0;i<2;i++){   head[i]=NULL;    }    head1=new Node();   for(int i=0;i<2;i++){   while(cin>>a>>b&&(a!=0||b!=-1)){   if(a==0)   {   continue;   }   if(head[i]==NULL)   {   Node *temp=new Node();   temp->a=a;   temp->b=b;   temp->next=NULL;   head[i]=new Node();   head[i]->next=temp;   }   else  {   Node *p,*q;   p=head[i]->next;   q=head[i];   while(p!=NULL&&p->b!=b)   {   q=p;   p=p->next;    }   if(p==NULL)   {   Node *temp=new Node();   temp->a=a;   temp->b=b;   temp->next=NULL;   q->next=temp;   }   else  {   p->a+=a;   if(p->a==0)   {   q->next=p->next;    }   }   }   }   print(head[i]);     }   p1=head[0]->next;   p2=head[1]->next;   k=head1;   while(p1!=NULL&&p2!=NULL)   {   Node *tempNode=new Node();   if(p1->b>p2->b)   {   tempNode->a=p1->a;   tempNode->b=p1->b;   p1=p1->next;   tag=false;   }    else if(p1->b<p2->b)   {   tempNode->a=p2->a;   tempNode->b=p2->b;   p2=p2->next;      tag=false;   }   else  {   if(p1->a+p2->a==0)   {   p1=p1->next;   p2=p2->next;   continue;    }    tempNode->a=p1->a+p2->a;   tempNode->b=p1->b;   p1=p1->next;    p2=p2->next;   tag=false;   }   k->next=tempNode;   k=tempNode;   }   while(p1!=NULL)   {   Node *tempNode=new Node();   tempNode->a=p1->a;   tempNode->b=p1->b;   k->next=tempNode;   k=tempNode;   p1=p1->next;   tag=false;   }   while(p2!=NULL)   {   Node *tempNode=new Node();   tempNode->a=p2->a;   tempNode->b=p2->b;   k->next=tempNode;   k=tempNode;   p2=p2->next;   tag=false;   }   if(!tag)   {   print(head1);   }   else  {   cout<<"0"<<endl;    }      return 0;   }  


0 0
原创粉丝点击