zoukankan      html  css  js  c++  java
  • 一元多项式的乘法与加法运算

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

    输入格式:

    输入分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

    AC代码:

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 typedef struct _node{   //创建链表节点
      4   int coef;             //系数
      5   int expon;            //指数
      6   struct _node *next;   
      7 }PolyNode,*Polynomial;
      8 
      9 Polynomial Mult(Polynomial P1,Polynomial P2);
     10 Polynomial Add(Polynomial P1,Polynomial P2);
     11 void Attach(int c,int e,Polynomial *pRear);
     12 void printPoly(Polynomial P);
     13 Polynomial ReadPoly();
     14 
     15 //自顶向下设计方案
     16 int main(){
     17   Polynomial P1,P2,PP,PS;
     18   //读入多项式
     19   P1 = ReadPoly();
     20   P2 = ReadPoly();
     21   //乘法运算并输出
     22   PP = Mult(P1,P2);
     23   printPoly(PP);
     24   //加法运算并输出
     25   PS = Add(P1,P2);
     26   printf("
    ");
     27   printPoly(PS);
     28   return 0;
     29 }
     30 
     31 Polynomial ReadPoly(){                  
     32   int c,e,N;
     33   Polynomial Rear,P,t;
     34   scanf("%d",&N);
     35   P = (Polynomial)malloc(sizeof(PolyNode));   //通过建立头结点使得while语句不需要判断是否是第一次
     36   Rear = P;                       //Rear表示最后一个节点
     37   Rear->next = NULL;
     38   while(N--){
     39     scanf("%d %d",&c,&e);
     40     Attach(c,e,&Rear);
     41   }
     42   t = P;
     43   P = P->next;
     44   free(t);        //删除头节点
     45   return P;        //返回的链表不含头节点
     46 }
     47 void Attach(int c,int e,Polynomial *pRear){      //pRear是指针的指针
     48   Polynomial P;
     49   P = (Polynomial)malloc(sizeof( PolyNode));
     50   P->coef = c;
     51   P->expon = e;
     52   P->next = NULL;
     53   (*pRear)->next = P;
     54   *pRear = P;
     55 }
     56 Polynomial Add(Polynomial P1,Polynomial P2){
     57   Polynomial t1,t2,P,Rear,t;
     58   t1 = P1;
     59   t2 = P2;
     60   P = (Polynomial)malloc(sizeof(PolyNode));
     61   Rear = P;
     62   P->next = NULL;
     63   while(t1&&t2){
     64     if(t1->expon > t2->expon){
     65       Attach(t1->coef,t1->expon,&Rear);
     66       t1 = t1->next;
     67     }else if(t1->expon<t2->expon){
     68       Attach(t2->coef,t2->expon,&Rear);
     69       t2 = t2->next;
     70     }else{
     71       if((t1->coef)+(t2->coef)){             //相等时如果和为0不需要添加,不为0需要添加
     72         Attach((t1->coef)+(t2->coef),t1->expon,&Rear);
     73         t1 = t1->next;
     74         t2 = t2->next;
     75       }else{
     76         t1 = t1->next;
     77         t2 = t2->next;
     78       }
     79     }
     80   }
     81   while(t1){
     82     Attach(t1->coef,t1->expon,&Rear);
     83     t1 = t1->next;
     84   }
     85   while(t2){
     86     Attach(t2->coef,t2->expon,&Rear);
     87     t2 = t2->next;
     88   }
     89   t = P;
     90   P = P->next;
     91   free(t);      //删除头节点
     92   return P;
     93 }
     94 
     95 Polynomial Mult(Polynomial P1,Polynomial P2){       //插入法实现
     96   Polynomial t1,t2,t,P,Rear;
     97   int e,c;
     98   P = (Polynomial)malloc(sizeof( PolyNode));
     99   Rear = P;
    100   P->next = NULL;
    101   t1 = P1;
    102   while(t1){
    103     t2 = P2;
    104     Rear = P;
    105     while(t2){
    106       e = t1->expon + t2->expon;
    107       c = t1->coef * t2->coef;
    108       while(Rear->next&&Rear->next->expon > e){   //搜索插入位置,不能用Attach
    109         Rear = Rear->next;
    110       }
    111       if(Rear->next&&Rear->next->expon == e){      //相等时
    112         if(Rear->next->coef + c){                  //系数和不为0则加上
    113           Rear->next->coef += c;
    114         }
    115         else{                                      //为0则删除该节点
    116           t = Rear->next;
    117           Rear->next = t->next;   
    118           free(t);
    119         }
    120       }else{                                         //不相等时
    121         t = (Polynomial)malloc(sizeof( PolyNode));    
    122         t->coef = c;
    123         t->expon = e;
    124         t->next = Rear->next;
    125         Rear->next = t;
    126         Rear = Rear->next;
    127       }
    128       t2 = t2->next;
    129     }
    130     t1 = t1->next;
    131   }
    132   t = P;
    133   P = P->next;
    134   free(t);         //删除头节点
    135   return P;
    136 }
    137 void printPoly(Polynomial P){
    138   if(!P){                              //P不存在就输出“0  0”
    139     printf("0 0");
    140     return;
    141   }
    142   int flag = 1;             //第一次输出与后来的区分以得到正确的格式要求
    143   while(P){
    144     if(flag ==1){
    145       printf("%d %d",P->coef,P->expon);
    146       flag = 0;
    147     }else{
    148       printf(" %d %d",P->coef,P->expon);
    149     }
    150     P = P->next;
    151   }
    152 }

  • 相关阅读:
    安卓学习26(ListView的焦点问题)
    ACL Contest1 B- Sum is Multiple 数论,EXGCD
    P4137 Rmq Problem / mex 可持久化线段树求区间MEX
    [可持久化权值线段树] [模板] [数组版本]
    CodeForces383C Propagating tree 思维 线段树 DFS序
    CodeForces 558E A Simple Task 线段树 桶排思想
    P1471 方差 线段树维护区间方差
    Leetcode1521 找到最接近目标的函数值 位运算
    CodeForces-739C Alyona and towers 线段树经典套路之维护左中右
    GYM-101194F Mr. Panda and Fantastic Beasts 后缀数组套路
  • 原文地址:https://www.cnblogs.com/jinjin-2018/p/8620567.html
Copyright © 2011-2022 走看看