多项式相乘的另一解法

来源:互联网 发布:视频软件管理条例2017 编辑:程序博客网 时间:2024/05/29 19:57

多项式相乘的另一解法是利用公式:


该图可以辅助说明算法思想


#include <stdio.h>#include <malloc.h>#define M 5   //第一个多项式阶数#define N 3   //第二个多项式阶数struct Po     //多项式节点结构体{int coef;   //项的系数  int exp;    //项的幂struct Po *next;};typedef struct Po Po1;struct Podual   //多项式双向链表结构体{int coef;   //系数int exp;    //幂struct Podual *next;struct Podual *before;};typedef struct Podual Podual1;void print(Po1 *head1);   //重载函数,打印多项式void print(Podual1 *head2);void main(){Po1 *p1before, *q1after, *p1, *head1;Podual1 *q2after, *p2, *head2;int i, temp;head1=(Po1 *)malloc(sizeof(Po1));head1->next=NULL;q1after=head1;for(i=0; i<=M; i++)      //建立第一个多项式{p1=(Po1 *)malloc(sizeof(Po1));p1->coef=i+1;p1->exp=i;p1->next=NULL;q1after->next=p1;q1after=p1;}printf("第一个多项式为:\n");  //输出第一个多项式print(head1);head2=(Podual1 *)malloc(sizeof(Podual1));head2->next=NULL;head2->before=NULL;q2after=head2;                   for(i=0; i<=N; i++)            //建立第二个多项式{p2=(Podual1 *)malloc(sizeof(Podual1));p2->coef=i+1;p2->exp=i;p2->next=NULL;q2after->next=p2;p2->before=q2after;q2after=p2;}printf("第二个多项式为:\n");        //输出第二个多项式print(head2);                         Po1 *head3, *psnew3, *tail3;head3=(Po1 *)malloc(sizeof(Po1));head3->next=NULL;                     //初始化第三个多项式tail3=head3;p1before=head1->next;q1after=head1->next;q2after=head2->next;for(i=0; i<=M+N; i++)     //依次求乘积多项式各项系数{temp=0;for(p1=p1before, p2=q2after; q1after->next!=p1; p1=p1->next, p2=p2->before){temp+=p1->coef*p2->coef;           //累加求次数为i的项的系数}psnew3=(Po1 *)malloc(sizeof(Po1));psnew3->coef=temp;psnew3->exp=i;psnew3->next=NULL;                //将求得的次数为i的项加入链表3tail3->next=psnew3;tail3=psnew3;if (i!=M+N){if(q1after->next!=NULL){q1after=q1after->next;   //q1after未指向尾节点时继续向后递进}if(q2after->next!=NULL){q2after=q2after->next;   //q2after未指向尾节点时继续向后递进}else{p1before=p1before->next;   //q2after指向尾节点时p1before向后递进}}}printf("多项式一和多项式二的乘积为:\n");   //输出乘积多项式print(head3);}void print(Po1 *head1){Po1 *psnew1;psnew1=head1->next;while(psnew1!=NULL){if(psnew1!=head1->next){printf("+");printf("%dX^%d", psnew1->coef, psnew1->exp);}else{printf("%d", psnew1->coef);}psnew1=psnew1->next;}printf("\n\n");}void print(Podual1 *head2){Podual1 *psnew2;psnew2=head2->next;while(psnew2!=NULL){if(psnew2!=head2->next){printf("+");printf("%dX^%d", psnew2->coef, psnew2->exp);}else{printf("%d", psnew2->coef);}psnew2=psnew2->next;}printf("\n\n");}
运行结果: