ACM 多项式加法
来源:互联网 发布:日本蜡烛图技术知乎 编辑:程序博客网 时间:2024/05/17 22:42
多项式加法
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:1458 测试通过:152
另外C++ 代码
总提交: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
- ACM 多项式加法
- acm训练 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- 多项式加法
- hdu4810
- RGB颜色表
- java实习总结
- android 控件花屏问题
- 《算法导论》笔记 第24章 24.5 最短路性质的证明
- ACM 多项式加法
- iis配置的网站,打开后弹出要输入用户名和密码的窗口
- js 与或运算符 || && 妙用
- 网络资源总结的一些在Java编程中尽可能要做到的一些地
- C#学习笔记5
- 【石子合并】_DP
- iOS笔记 Collection View Controller
- 腾讯的新闻称中国老头三天破解世界最难九宫格
- 为什么要用RMI