3-一元多项式的乘法

y1=3x^4-5x^2+6x-2、y2=5x^20-7x^4+3x,求y1*y2

怎么编程实现???

y=y1*y2=15x^24-25x^22+30x^21-10x^20-21x^8+35x^6-33x^5+14x^4-15x^3+18x^2-6x

 

思路:

  当时的办法是先用y1的第一项乘以y2的每一项,每一个结果建立一个节点;再用y1的第二项乘以y2的每一项,每一个结果建立一个节点;.....

但是就会有一个问题,最后指数的大小不是递减的,而是乱序的

  那么就只能再建立一个函数,这个函数的功能是把乱序的链表,根据指数递减的方式把它重新排列,但是排列不难,就是会遇到一个问题,如果链表中两个节点的指数是相同的,怎么解决???

   这个问题一直没有解决,所以就只能换一种方法了。最后还是用的老师的方法

老师的方法:

  

 

 

 

Input

  n----多少项

  c--系数  e--指数

Ouput

  c--系数  e--指数

  

 

 

 

 没有代码怎么可以!!!

  1 //一元多项式的乘法 
  2 
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <stdbool.h>
  6 
  7 typedef struct LNode *Link;
  8 struct LNode{
  9     int coef;    //系数 
 10     int expon;    //指数 
 11     Link Next;    //指向下一个节点的指针 
 12 };
 13 
 14 Link Read(){
 15     Link Rear,L,Temp;
 16     int num,c,e;
 17     
 18     L=(Link)malloc(sizeof(struct LNode));
 19     L->Next=NULL;
 20     Rear=L;
 21     scanf("%d\n",&num);
 22     while(num--){
 23         scanf("%d %d",&c,&e);
 24         Attach(c,e,&Rear);
 25     }
 26     
 27     Temp=L;
 28     L=L->Next;
 29     free(Temp);
 30     return L;  //返回多项式的头结点 
 31 }
 32 
 33 void Attach(int c,int e,Link *pRear){
 34     Link K;
 35     K=(Link)malloc(sizeof(struct LNode)); 
 36     K->coef=c;
 37     K->expon=e;
 38     K->Next=NULL;
 39     (*pRear)->Next=K;
 40     (*pRear)=K;    
 41 }
 42 
 43 
 44 //实现多项式相乘 
 45 Link Mult(Link L1,Link L2){
 46     Link L,Rear,T1,T2,T;
 47     int c,e;
 48     
 49     if(!L1 || !L2){    //判断两个多项式是否为空,若为空,则返回 
 50         return NULL;
 51     } 
 52     
 53     T1=L1,T2=L2;
 54     L=(Link)malloc(sizeof(struct LNode));
 55     L->Next=NULL;
 56     Rear=L;
 57     
 58     while(T2){
 59         Attach(T1->coef*T2->coef,T1->expon+T2->expon,&Rear);
 60         T2=T2->Next;
 61     }
 62     
 63     T1=T1->Next;
 64     while(T1){
 65         T2=L2,Rear=L;
 66         while(T2){
 67             c=T1->coef*T2->coef;
 68             e=T1->expon+T2->expon;
 69             while(Rear->Next && Rear->Next->expon>e){
 70                 Rear=Rear->Next;
 71             }
 72             if(Rear->Next && Rear->Next->expon==e){
 73                 if(Rear->Next->coef+c){
 74                     Rear->Next->coef +=c;
 75                 }else{   //系数值为0 
 76                     T=Rear->Next;
 77                     Rear=Rear->Next;
 78                     free(T);
 79                 }
 80             }else{
 81                 T=(Link)malloc(sizeof(struct LNode));
 82                 T->coef=c;
 83                 T->expon=e;
 84                 T->Next=Rear->Next;
 85                 Rear->Next=T;
 86                 Rear=Rear->Next; 
 87             }
 88             T2=T2->Next;
 89         }
 90         T1=T1->Next;
 91     }
 92     T1=L;
 93     L=L->Next;
 94     free(T2);
 95     return L;
 96 } 
 97 
 98 void Print(Link L){
 99     
100     while(L){
101         printf("%d --- %d\n",L->coef,L->expon);
102         L=L->Next;
103     }
104 }
105 
106 int main(){
107     Link L1,L2;
108     L1=Read();
109     L2=Read();
110     
111     printf("\n");
112     L1=Mult(L1,L2);
113     Print(L1);        
114 }
115  
116  
posted on 2019-12-30 16:01  韩盼  阅读(380)  评论(0)    收藏  举报