码迷,mamicode.com
首页 > 其他好文 > 详细

一元多项式的乘法与加法运算

时间:2019-03-30 01:04:47      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:return   运算   nbsp   ntp   --   adp   数字   print   node   

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
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

 

代码如下:

  1 #include <stdio.h>
  2 
  3 typedef struct PolyNode
  4 {
  5     int coef;
  6     int expon;
  7     struct PolyNode *link;
  8 }*Polynomial;
  9 
 10 void Attach(int a,int b,Polynomial *pRear)
 11 {
 12     Polynomial P;
 13     P=(Polynomial)malloc(sizeof(struct PolyNode));
 14     P->coef=a;
 15     P->expon=b;
 16     P->link=NULL;
 17     (*pRear)->link=P;
 18     *pRear=P;
 19 }
 20 
 21 Polynomial ReadPoly()
 22 {
 23     Polynomial P,Rear,t;
 24     int n,a,b;
 25     scanf("%d",&n);
 26     P=(Polynomial)malloc(sizeof(struct PolyNode));
 27     P->link=NULL;
 28     Rear=P;
 29     while(n--)
 30     {
 31         scanf("%d %d",&a,&b);
 32         Attach(a,b,&Rear);
 33     }
 34     t=P;
 35     P=P->link;
 36     free(t);
 37     return P;
 38 }
 39 
 40 Polynomial Add(Polynomial P1,Polynomial P2)
 41 {
 42     Polynomial front,rear,temp;
 43     int sum;
 44     rear=(Polynomial)malloc(sizeof(struct PolyNode));
 45     front=rear;
 46     while(P1&&P2)
 47     {
 48         if(P1->expon>P2->expon)
 49         {
 50             Attach(P1->coef,P1->expon,&rear);
 51             P1=P1->link;
 52         }
 53         if(P1->expon<P2->expon)
 54         {
 55             Attach(P2->coef,P2->expon,&rear);
 56             P2=P2->link;
 57         }
 58         if(P1->expon==P2->expon)
 59         {
 60             sum=P1->coef+P2->coef;
 61             if(sum)
 62             {
 63                 Attach(sum,P1->expon,&rear);
 64             }
 65             P1=P1->link;
 66             P2=P2->link;
 67         }
 68     }
 69     for(;P1;P1=P1->link) Attach(P1->coef,P1->expon,&rear);
 70     for(;P2;P2=P2->link) Attach(P2->coef,P2->expon,&rear);
 71     rear->link=NULL;
 72     temp=front;
 73     front=front->link;
 74     free(temp);
 75     return front; 
 76 }
 77 
 78 Polynomial Mult(Polynomial P1,Polynomial P2)
 79 {
 80     Polynomial P,Rear,t1,t2,t;
 81     int a,b;
 82     if(!P1||!P2) return NULL;
 83     t1=P1;
 84     t2=P2;
 85     P=(Polynomial)malloc(sizeof(struct PolyNode));
 86     P->link=NULL;
 87     Rear=P;
 88     while(t2)
 89     {
 90         Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
 91         t2=t2->link;
 92     }
 93     t1=t1->link;
 94     while(t1)
 95     {
 96         t2=P2;
 97         Rear=P;
 98         while(t2)
 99         {
100             a=t1->coef*t2->coef;
101             b=t1->expon+t2->expon;
102             while(Rear->link&&Rear->link->expon>b)
103             {
104                 Rear=Rear->link;
105             }
106             if(Rear->link&&Rear->link->expon==b)
107             {
108                 if(Rear->link->coef+a)
109                     Rear->link->coef+=a;
110                 else
111                 {
112                     t=Rear->link;
113                     Rear->link=t->link;
114                     free(t);
115                 }
116             }
117             else
118             {
119                 t=(Polynomial)malloc(sizeof(struct PolyNode));
120                 t->coef=a;
121                 t->expon=b;
122                 t->link=Rear->link;
123                 Rear->link=t;
124                 Rear=Rear->link;
125             }
126             t2=t2->link;
127         }
128         t1=t1->link;
129     }
130     t2=P;
131     P=P->link;
132     free(t2);
133     return P;
134 }
135 
136 void PrintPoly(Polynomial P)
137 {
138     int flag=0;
139     if(!P)
140     {
141         printf("0 0\n");
142         return ;
143     }
144     while(P)
145     {
146         if(!flag) flag=1;
147         else printf(" ");
148         printf("%d %d",P->coef,P->expon);
149         P=P->link;
150     }
151     printf("\n");
152 }
153 
154 int main()
155 {
156     Polynomial P1,P2,PP,PS;
157     
158     P1=ReadPoly();
159     P2=ReadPoly();
160     PP=Mult(P1,P2);
161     PrintPoly(PP);
162     PS=Add(P1,P2);
163     PrintPoly(PS);
164      
165     return 0;
166 }

 

一元多项式的乘法与加法运算

标签:return   运算   nbsp   ntp   --   adp   数字   print   node   

原文地址:https://www.cnblogs.com/jiamian/p/10625002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!