zoukankan      html  css  js  c++  java
  • polynomial multiplcation

    use simple linked list ADT:

    about the running time of polynode multiply2(const polynode p1,const polynode p2), assume size of p1 is M,size of p2 is N, the result should be:

    M*N+2N+3N+4N+5N+…+(M-1)N=M*N+(M+1)*(M-1)*N/2=O(M2*N)

       1:  #include <stdio.h>
       2:  #include <stdlib.h>
       3:  struct node;
       4:  typedef struct node *ptr_to_node;
       5:  typedef ptr_to_node polynode;
       6:  struct node
       7:  {
       8:      int coefficient;
       9:      int exponent;
      10:      polynode next;
      11:  };
      12:  void duplicate_and_combine(polynode p1,const polynode p2);
      13:   
      14:  void print_poly(polynode p)
      15:  {
      16:      polynode c=p->next;
      17:      if(c==NULL)
      18:      {
      19:          printf("empty polynomial\n");
      20:          return;
      21:      }
      22:   
      23:      while(c->next!=NULL)
      24:      {
      25:          printf("%d*X(%d)+",c->coefficient,c->exponent);
      26:          c=c->next;
      27:      }
      28:      printf("%d*X(%d)\n",c->coefficient,c->exponent);
      29:  }
      30:   
      31:  void emptypoly(polynode p)
      32:  {
      33:      p->next=NULL;
      34:      p->coefficient=p->exponent=0;
      35:  }
      36:   
      37:  polynode create_newpoly()
      38:  {
      39:      polynode p=malloc(sizeof(struct node));
      40:      emptypoly(p);
      41:      return p;
      42:  }
      43:   
      44:  /*
      45:  link the second polynomial after the tail of first polynomial
      46:  no sorting, O(M+N)
      47:  */
      48:  polynode add_polynomial1(const polynode p1,const polynode p2)
      49:  {
      50:      polynode sum=create_newpoly();
      51:      duplicate_and_combine(sum,p1);
      52:      duplicate_and_combine(sum,p2);
      53:      return sum;
      54:  }
      55:   
      56:  /*
      57:  link the two polynomial step by step with power sort with asdending
      58:  assume the original two polynomial are already sorted and combined
      59:  O(M+N)
      60:  */
      61:  polynode add_polynomial2(const polynode p1, polynode p2)
      62:  {
      63:      polynode sum=create_newpoly();
      64:      polynode c1=p1->next;
      65:      polynode c2=p2->next;
      66:      polynode c3=sum;
      67:   
      68:      while(c1!=NULL && c2!=NULL)
      69:      {
      70:          c3->next=create_newpoly();
      71:          if(c1->exponent>c2->exponent)
      72:          {
      73:              c3->next->exponent=c1->exponent;
      74:              c3->next->coefficient=c1->coefficient;
      75:              c1=c1->next;
      76:          }
      77:          else if(c1->exponent==c2->exponent)
      78:          {
      79:              c3->next->exponent=c1->exponent;
      80:              c3->next->coefficient=c1->coefficient+c2->coefficient;
      81:              c1=c1->next;
      82:              c2=c2->next;
      83:          }
      84:          else
      85:          {
      86:              c3->next->exponent=c2->exponent;
      87:              c3->next->coefficient=c2->coefficient;
      88:              c2=c2->next;
      89:          }
      90:          c3=c3->next;
      91:      }
      92:   
      93:      polynode c4=NULL;
      94:      if(c1!=NULL)
      95:      {
      96:          c4=c1;
      97:      }
      98:      else if(c2!=NULL)
      99:      {
     100:          c4=c2;
     101:      }
     102:   
     103:      while(c4!=NULL)
     104:      {
     105:          c3->next=create_newpoly();
     106:          c3->next->exponent=c4->exponent;
     107:          c3->next->coefficient=c4->coefficient;
     108:          c4=c4->next;
     109:          c3=c3->next;
     110:      }
     111:   
     112:      return sum;
     113:  }
     114:   
     115:  /*
     116:  multiply two polynomials, no sorting
     117:  O(M*N)
     118:  */
     119:  polynode multiply1(const polynode p1,const polynode p2)
     120:  {
     121:      polynode res=create_newpoly();
     122:      polynode c1=p1->next;
     123:      polynode c3=res;
     124:   
     125:      while(c1!=NULL)
     126:      {
     127:          polynode c2=p2->next;
     128:          while(c2!=NULL)
     129:          {
     130:              c3->next=create_newpoly();
     131:              c3->next->coefficient=c1->coefficient*c2->coefficient;
     132:              c3->next->exponent=c1->exponent+c2->exponent;
     133:              c3=c3->next;
     134:              c2=c2->next;
     135:          }
     136:          c1=c1->next;
     137:      }
     138:      return res;
     139:  }
     140:   
     141:  /*
     142:  multiply two polynomials with exponent sorted output
     143:  assume the original two polynomials are in sorted order
     144:  O(M*M*N)
     145:  */
     146:  polynode multiply2(const polynode p1,const polynode p2)
     147:  {
     148:      polynode res=create_newpoly();
     149:      polynode c1=p1->next;
     150:   
     151:   
     152:      while(c1!=NULL)
     153:      {
     154:          polynode temp=create_newpoly();
     155:          polynode c2=p2->next;
     156:          polynode c3=temp;
     157:          while(c2!=NULL)
     158:          {
     159:              c3->next=create_newpoly();
     160:              c3->next->coefficient=c1->coefficient*c2->coefficient;
     161:              c3->next->exponent=c1->exponent+c2->exponent;
     162:              c3=c3->next;
     163:              c2=c2->next;
     164:          }
     165:   
     166:          res=add_polynomial2(res,temp);
     167:          c1=c1->next;
     168:      }
     169:   
     170:      return res;
     171:  }
     172:   
     173:  /*
     174:  combine the second to the first
     175:  */
     176:  void duplicate_and_combine(polynode p1,const polynode p2)
     177:  {
     178:      polynode c1=p1;
     179:      polynode c2=p2->next;
     180:      while(c1->next!=NULL)
     181:      {
     182:          c1=c1->next;
     183:      }
     184:   
     185:      while(c2!=NULL)
     186:      {
     187:          c1->next=create_newpoly();
     188:          c1->next->coefficient=c2->coefficient;
     189:          c1->next->exponent=c2->exponent;
     190:          c2=c2->next;
     191:          c1=c1->next;
     192:      }
     193:  }
     194:   
     195:  int main()
     196:  {
     197:      polynode p1=create_newpoly();
     198:      p1->next=create_newpoly();
     199:      p1->next->next=create_newpoly();
     200:      p1->next->coefficient=5;
     201:      p1->next->exponent=5;
     202:      p1->next->next->coefficient=4;
     203:      p1->next->next->exponent=4;
     204:      polynode p2=create_newpoly();
     205:      p2->next=create_newpoly();
     206:      p2->next->next=create_newpoly();
     207:      p2->next->coefficient=4;
     208:      p2->next->exponent=4;
     209:      p2->next->next->coefficient=3;
     210:      p2->next->next->exponent=3;
     211:      print_poly(p1);
     212:      print_poly(p2);
     213:   
     214:      polynode sum=add_polynomial1(p1,p2);
     215:      print_poly(sum);
     216:      sum=add_polynomial1(sum,p2);
     217:      print_poly(sum);
     218:      print_poly(p1);
     219:      print_poly(p2);
     220:   
     221:      sum=add_polynomial2(p1,p2);
     222:      print_poly(sum);
     223:      print_poly(p1);
     224:      print_poly(p2);
     225:   
     226:      polynode res=multiply1(p1,p2);
     227:      print_poly(res);
     228:      print_poly(p1);
     229:      print_poly(p2);
     230:   
     231:      polynode res2=multiply2(p1,p2);
     232:      print_poly(res2);
     233:      print_poly(p1);
     234:      print_poly(p2);
     235:      printf("Hello world!\n");
     236:      return 0;
     237:  }

    在第80行需要handle系数之和为0的情况, 修改add_polynomial2函数fix此问题:

       1:  polynode add_polynomial2(const polynode p1, polynode p2)
       2:  {
       3:      polynode sum=create_newpoly();
       4:      polynode c1=p1->next;
       5:      polynode c2=p2->next;
       6:      polynode c3=sum;
       7:   
       8:      while(c1!=NULL && c2!=NULL)
       9:      {
      10:          if(c1->coefficient+c2->coefficient==0)
      11:          {
      12:              continue;
      13:          }
      14:          else
      15:          {
      16:              c3->next=create_newpoly();
      17:          }
      18:   
      19:   
      20:          if(c1->exponent>c2->exponent)
      21:          {
      22:              c3->next->exponent=c1->exponent;
      23:              c3->next->coefficient=c1->coefficient;
      24:              c1=c1->next;
      25:          }
      26:          else if(c1->exponent==c2->exponent)
      27:          {
      28:              c3->next->exponent=c1->exponent;
      29:              c3->next->coefficient=c1->coefficient+c2->coefficient;
      30:              c1=c1->next;
      31:              c2=c2->next;
      32:   
      33:          }
      34:          else
      35:          {
      36:              c3->next->exponent=c2->exponent;
      37:              c3->next->coefficient=c2->coefficient;
      38:              c2=c2->next;
      39:          }
      40:          c3=c3->next;
      41:      }
      42:   
      43:      polynode c4=NULL;
      44:      if(c1!=NULL)
      45:      {
      46:          c4=c1;
      47:      }
      48:      else if(c2!=NULL)
      49:      {
      50:          c4=c2;
      51:      }
      52:   
      53:      while(c4!=NULL)
      54:      {
      55:          c3->next=create_newpoly();
      56:          c3->next->exponent=c4->exponent;
      57:          c3->next->coefficient=c4->coefficient;
      58:          c4=c4->next;
      59:          c3=c3->next;
      60:      }
      61:   
      62:      return sum;
      63:  }
  • 相关阅读:
    android开发中的数据库SQLite的使用
    线程间的同步和通信机制
    关于垃圾回收
    进程间通信
    Thread和Runnable
    关于软件项目管理的感想~~~~~
    关于集成测试&&同行评审
    Junit and Maven Test
    window git
    use case
  • 原文地址:https://www.cnblogs.com/dancewithautomation/p/2559446.html
Copyright © 2011-2022 走看看