题目:一元多项式的乘法与加法运算
输入样例:
4 3 4 -5 2 6 1 -2 0 //其中第一项4表示为输入的项数
3 5 20 -7 4 3 1
输出样例:
乘输出:15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
加输出:5 20 -4 4 -5 2 9 1 -2 0
//此程序有一个BUG,在于输入数据P1项少于P2项输出结果才会正确(项数少的排成P1);但是我用排序组合使得P1为项数少的。
//说明程序有点小BUG,希望有道友能帮我指点出来
//此程序有一个BUG,在于输入数据P1项少于P2项输出结果才会正确(项数少的排成P1) #include<cstdio> #include<iostream> #include<malloc.h> #include <stdlib.h> #include<vector> using namespace std; vector<int>a; //创建链表头 typedef struct Polynomial//PolyNode是结构名,Polynomial是结构体别名 { int cofe; int expon; struct Polynomial *link; Polynomial():cofe(NULL),expon(NULL),link(NULL){}//构造函数初始化 }Polynomial; void add(int c,int e,Polynomial *PRear) { { Polynomial *p; p=(Polynomial*) malloc(sizeof(Polynomial)); p->link=NULL;p->cofe=NULL;p->expon=NULL; PRear->cofe=c; PRear->expon=e; PRear->link=p; } } Polynomial *Polyread()//指针函数 { Polynomial *Rear,*P; int c,e,N; scanf("%d",&N);//N表示最高阶阶数,如果要加上常数 a.push_back(N); P=(Polynomial*) malloc(sizeof(Polynomial));//之前有个程序通过函数newNode 开辟空间 P->link=NULL; Rear=P;//这一行程序非常重要,用Rear指向其Head头文件,通过P不断增加链表文件,最后Rear地址为最开始地址 while(N--)//N表示输入项数 { // scanf("%d%d",&c,&e);if(c!=0 &&c!=NULL)// if(scanf("%d%d",&c,&e)==2&&c)//--可以让输入DD字符停止不录入到链表中 { add(c,e,P); P=P->link; } } //多循环一次是加上常数项 P->cofe=NULL; P->expon=NULL; return Rear; } Polynomial *MultiAdd(Polynomial *p1,Polynomial *p2) { Polynomial *t1=p1,*t2=p2;//如果将p1,p2设置成指针的话可能好调试 Polynomial *P,*Rear,*t; P=(Polynomial*) malloc(sizeof(struct Polynomial )); P->link=NULL; Rear=P; //记住首地址 while(t1->link && t2->link) { if((t1->expon) < (t2->expon)) { add(t2->cofe,t2->expon,P); P=P->link; t2=t2->link; } else if((t1->expon) > (t2->expon)) { add(t1->cofe,t1->expon,P); P=P->link; t1=t1->link; } else { if(t1->cofe==-(t2->cofe)) { t1=t1->link; t2=t2->link; } else { add((t1->cofe+t2->cofe),t1->expon,P); P=P->link; t1=t1->link; t2=t2->link; } } } while(t1->link) { add(t1->cofe,t1->expon,P); P=P->link; t1=t1->link; } while(t2->link) { add(t2->cofe,t2->expon,P); P=P->link; t2=t2->link; } //在开头时候必须要加上其最高的阶数 t=(Polynomial*) malloc(sizeof(struct Polynomial )); t->cofe=NULL; t->expon=Rear->expon; t->link=Rear; Rear=t; return Rear; } Polynomial *Mult(Polynomial *p1,Polynomial *p2) { Polynomial *t1,*t2;//在这里我是强制将项少的赋予t1 if(a[0]>=a[1]) { t1=p2;t2=p1; } else { t1=p1;t2=p2; } Polynomial *P,*Rear,*o,*p,*t; P=(Polynomial*) malloc(sizeof(struct Polynomial )); P->link=NULL;Rear=P;//保存地址 //采用插入乘法 { while(t2->link&&t2->cofe!=NULL) { add((t1->cofe*t2->cofe),(t1->expon+t2->expon),P);//将P1第一项与P2各项相乘 t2=t2->link; P=P->link; } t1=t1->link; while(t1->link&&t1->cofe!=NULL) { t2=p2;//开始插入 p=P; while(t2->link&&t1->cofe!=NULL) { int e=t1->expon+t2->expon; int c=t1->cofe*t2->cofe; while (p->cofe!=NULL&&p->link &&p->link->expon>e)//开始插入 p=p->link;//指针不断移动到e大的前一位节点 if(p->cofe!=NULL&& p->link&&p->link->expon==e ) { if((p->link->cofe+c)!=0) p->link->cofe=c+p->link->cofe; else//表示同指数系数相反,则要把此节点释放 {p->link=p->link->link; // t=p->link; // p->link=t->link; //free(t); } } else { o=(Polynomial*) malloc(sizeof(struct Polynomial ));//申请空间,直接插入 if(p->cofe!=NULL) { o->cofe=c;o->expon=e;o->link=NULL; o->link=p->link; p->link=o; p=p->link; } else { p->cofe=c; p->expon=e; p->link=o; o->cofe=NULL;o->expon=NULL;o->link=NULL; } } t2=t2->link; } t1=t1->link; } } return Rear; } int main() { Polynomial *p1,*p2,*pp,*ps; p1=Polyread(); p2=Polyread(); pp=MultiAdd(p1,p2); ps=Mult(p1,p2); return 0; }