1009 Product of Polynomials (25分)
This time, you are supposed to find A×B where A and B are two polynomials.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N1 aN1 N2 aN2 ... NK aNK
where K is the number of nonzero terms in the polynomial, Ni and aNi (,) are the exponents and coefficients, respectively. It is given that 1, 0.
Output Specification:
For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.
Sample Input:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output:
3 3 3.6 2 6.0 1 1.6
方法一:链表法(不建议使用)
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string.h> using namespace std; //多项式相乘与相加 const int maxn=110010; typedef struct Node{ int expon; double coef; struct Node *next; }node,*pNode; pNode ReadPoly(pNode p){ int K; pNode q,r; scanf("%d",&K); p=new node; p->next=NULL; r=p; while(K--){ q=new node; scanf("%d %lf",&q->expon,&q->coef); r->next=q; r=r->next; } r->next=NULL; return p; } void printPoly(pNode p){ pNode q,r; int k=0; r=p->next; while(r) { if(r->coef!=0) { k++; } r=r->next; } printf("%d ",k); q=p->next; while(q){ if(q->coef==0){//系数为0,则不必输出 q=q->next; continue; } if(q->next!=NULL) { printf("%d %.1f ",q->expon,q->coef); } else{ printf("%d %.1f",q->expon,q->coef); } q=q->next; } printf("\n"); } pNode Mult(pNode p1,pNode p2){ pNode ps,psn,ppp; ps=new node;//新链表头部 ps->expon=0; ps->coef=0; ps->next=NULL; // psn=pp;//新链表尾部 pNode p11,p22; p11=p1->next; int flog=0; // p22=p2->next; while(p11){ p22=p2->next;//返回链表第一个结点 while(p22){ ppp=new node; ppp->expon=p11->expon+p22->expon; ppp->coef=p11->coef*p22->coef; psn=ps;//返回链表头节点 flog=0; while(psn->next) { if(psn->next->expon==ppp->expon){ flog=1; break; } else{ psn=psn->next; } } if(flog==1){ psn->next->expon=ppp->expon; psn->next->coef=psn->next->coef+ppp->coef;//注意不要写错哦 } else{ psn->next=ppp; psn=psn->next; psn->next=NULL; } p22=p22->next; } p11=p11->next; } return ps; } pNode Add(pNode p1,pNode p2){ pNode ps,pp1,ppp;//pp指向链表头部,pp1指向链表尾部,ppp指向新节点 pNode p11,p22;//p11,p22都指向链表尾部 p11=p1->next; p22=p2->next; ps=new node; pp1=ps; while(p11&&p22){ ppp=new node; if(p11->expon>p22->expon){ ppp->expon=p11->expon; ppp->coef=p11->coef; pp1->next=ppp; pp1=pp1->next; p11=p11->next; } else if(p11->expon<p22->expon){ ppp->expon=p22->expon; ppp->coef=p22->coef; pp1->next=ppp; pp1=pp1->next; pp1->next=NULL; p22=p22->next; } else if(p11->expon==p22->expon){ ppp->expon=p11->expon; ppp->coef=p11->coef+p22->coef; pp1->next=ppp; pp1=pp1->next; p11=p11->next; p22=p22->next; } } if(p11!=NULL){ pp1->next=p11; } if(p22!=NULL){ pp1->next=p22; } return ps; } pNode sort(pNode p){//冒泡排序 pNode r,t; int ti; double td; r=p->next; while(r){ t=r->next; while(t){ if(t->expon>r->expon){ ti=t->expon; td=t->coef; t->expon=r->expon; t->coef=r->coef; r->expon=ti; r->coef=td; } t=t->next; } r=r->next; } return p; } int main(){ pNode p1,p2,pp,ps; p1=ReadPoly(p1); p2=ReadPoly(p2); pp=Mult(p1,p2); pp=sort(pp); printPoly(pp); // ps=Add(p1,p2); // pp=sort(pp); // printPoly(ps); return 0; }
方法二:利用数组
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<string.h> using namespace std; const int maxn=101000; struct node{ int expon; double coef; }; bool compare(node a,node b){ return a.expon>b.expon; } int main(){ vector<node> p1,p2,p3; int m,n,e; node nd; double c; scanf("%d",&m); while(m--){ scanf("%d %lf",&nd.expon,&nd.coef); p1.push_back(nd); } scanf("%d",&n); while(n--){ scanf("%d %lf",&nd.expon,&nd.coef); p2.push_back(nd); } node p; int flog=0,k; for(int i=0;i<p1.size();i++){ for(int j=0;j<p2.size();j++){ p.expon=p1[i].expon+p2[j].expon; p.coef=p1[i].coef*p2[j].coef; flog=0; for(k=0;k<p3.size();k++){ if(p3[k].expon==p.expon){ flog=1; p3[k].coef=p3[k].coef+p.coef; break; } } if(flog==0){ p3.push_back(p); } } } sort(p3.begin(),p3.end(),compare); int t=0; for(int i=0;i<p3.size();i++){ if(p3[i].coef!=0){ t++; } } printf("%d ",t); for(int i=0;i<p3.size();i++){ if(p3[i].coef==0){ continue; } if(i<p3.size()-1) printf("%d %.1f ",p3[i].expon,p3[i].coef); else{ printf("%d %.1f",p3[i].expon,p3[i].coef); } } printf("\n"); return 0; }