zoukankan      html  css  js  c++  java
  • 多项式四则混合运算(链表法)

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    #define LEN1 sizeof(struct Queue1)
    #define LEN2 sizeof(struct Queue2)
    #define LEN3 sizeof(struct Queue3)
    using namespace std;


    struct Queue1{
     double xishu;
     char zimu[10];
     double cishu[10];
     struct Queue1 *next;
    };//第一个多项式


    struct Queue2{
     double xishu;
     char zimu[10];
     double cishu[10];
     int mark;
     struct Queue2 *next;
    };//第二个多项式

    struct Queue3{
     double xishu;
     char zimu[10];
     double cishu[10];
     int mark;
        struct Queue3 *next;
    };用来存储的多项式

    int main()
    {
     void AddQueue(struct Queue1 *A,struct Queue2 *B);//多项式加法
     void DecQueue(struct Queue1 *C,struct Queue2 *D);//多项式减法
     void MulQueue(struct Queue1 *E,struct Queue2 *F);//多项式乘法 
     void DivQueue(struct Queue1 *G,struct Queue2 *H);//多项式除法
     int n,m,n1,m1;
     struct Queue1 *head1,*p1;
     struct Queue2 *head2,*p2;

        printf("欢迎使用本多项式计算系统\n");
     printf("-----------------------------------------------------\n");
     while(1)
     {
      head1=p1=(struct Queue1 *)malloc(LEN1);
         head2=p2=(struct Queue2 *)malloc(LEN2);
      printf("请输入第一个多项式的各项信息\n");
      printf("请输入该多项式的项数n\n");
      cin>>n;
      n1=n;
      while(n1--)
      {
               
             printf("请输入第%d项的内容\n",n-n1);
       printf("系数   各元\n");
       scanf("%lf%s",&p1->xishu,&p1->zimu);
          for(int j=0;j<strlen(p1->zimu);j++)
       {
       printf("第%d项次数\n",j+1);
       cin>>p1->cishu[j];
       }
                p1->next=(struct Queue1 *)malloc(LEN1);
       p1=p1->next;
       }
          p1->next=NULL;
      
       
      printf("请输入第二个多项式的各项信息:\n");
      printf("请输入该多项式的项数:\n");
      cin>>m;
            m1=m;
      while(m1--)
            {
                printf("请输入第%d项的内容\n",m-m1);
       printf("系数   各元\n");
       scanf("%lf%s",&p2->xishu,&p2->zimu);
       for(int j=0;j<strlen(p2->zimu);j++)
       {
       printf("第%d项的次数\n",j+1); 
       cin>>p2->cishu[j];
       }
       p2->next=(struct Queue2 *)malloc(LEN2);
       p2=p2->next;
      }
             p2->next=NULL;
        while(1)
        {
           printf("-----------------------------------------------------\n");
        printf("                多项式加法,请按“1”                \n");
        printf("                多项式减法,请按“2”                \n");
        printf("                多项式乘法,请按“3”                \n");
           printf("                多项式除法,请按“4”                \n");
        printf("              重新输入多项式,请按“5”              \n");
        printf("-----------------------------------------------------\n");
        int ch,mark=0;
        cin>>ch;
        switch(ch)
        {
                       case 1:AddQueue(head1,head2);break;
                       case 2:DecQueue(head1,head2);break;
        case 3:MulQueue(head1,head2);break;
        case 4:DivQueue(head1,head2);break;
        case 5:mark=1;break;
        default:printf("输入错误\n");break;
        }
        if(mark==1)
         break;
        }
      printf("您是否要结束操作,如果是,请输入“YES”,否则的话请输入“NO”\n");
         char end[10];
      scanf("%s",end);
      if(strcmp(end,"YES")==0)
      {
       printf("感谢您的使用,再见!!!\n");
          break;
     }
     }
     return 0;
    }

    void AddQueue(struct Queue1 *A,struct Queue2 *B)//多项式加法
    {
     struct Queue1 *head1,*p1;
     struct Queue2 *head2,*p2;
     struct Queue3 *head3,*p3;
     head3=p3=(struct Queue3 *)malloc(LEN3);
        head1=p1=A;
     head2=p2=B;
     int n1=0,m1=0;
     while(p2->next!=NULL)//设立标志位,计入该项是否使用过
     {  
      p2->mark=0;
      p2=p2->next;
     }

     
     
     p2=head2;
     while(p1->next!=NULL)//多项式加法运算
     {
      int jishu=0,jishu2;
       p2=head2;
      while(p2->next!=NULL)
      {
                jishu2=0;
       if(strcmp(p1->zimu,p2->zimu)==0)
        {
         for(int i=0;i<strlen(p1->zimu);i++)
           if(p1->cishu[i]!=p2->cishu[i])
          {
           jishu2=1;
                          break;
          }
         
         if(jishu2==0)
         {
           p3->xishu=p1->xishu+p2->xishu;
              for(int i=0;i<strlen(p1->zimu);i++)
              p3->cishu[i]=p1->cishu[i];
           p2->mark=1;
           strcpy(p3->zimu,p1->zimu);
           jishu=1;
           n1++;

          
         }
        }
             
        p2=p2->next;
      }
      
      
      if(jishu==0)
       {
        p3->xishu=p1->xishu;
           for(int i=0;i<strlen(p1->zimu);i++)
        p3->cishu[i]=p1->cishu[i];
                 strcpy(p3->zimu,p1->zimu);
        n1++;
        }
        p3->next=(struct Queue3 *)malloc(LEN3);
        p3=p3->next;
        p1=p1->next;
     }
     p3->next=NULL;
     
     
     

     p2=head2;
     while(p2->next!=NULL)//处理第二个多项式的剩余项
     {
      if(p2->mark==0)
      {
       p3->xishu=p2->xishu;
          for(int i=0;i<strlen(p2->zimu);i++)
       p3->cishu[i]=p2->cishu[i];
       strcpy(p3->zimu,p2->zimu);
       n1++;
       p3->next=(struct Queue3 *)malloc(LEN3);
          p3=p3->next;
      }
         p2=p2->next;
     }
     p3->next=NULL;
        p3=head3;
     int num=1;
      printf("两个多项式相加的结果为:\n");
      while(p3->next!=NULL)
     {
      
        printf("%.0lf*",p3->xishu);
        for(int i=0;i<strlen(p3->zimu);i++)
        {
         cout<<p3->zimu[i]<<"("<<p3->cishu[i]<<")";
        }
        if(num!=n1)
        cout<<"+";
        p3=p3->next;
        num++;
     }
    cout<<endl;
    }

    void DecQueue(struct Queue1 *C,struct Queue2 *D)//多项式减法
    {
     struct Queue1 *head1,*p1;
     struct Queue2 *head2,*p2;
     struct Queue3 *head3,*p3;
     head3=p3=(struct Queue3 *)malloc(LEN3);
        head1=p1=C;
     head2=p2=D;
     int n1=0,m1=0;
     while(p2->next!=NULL)//设立标志位
     {  
      p2->mark=0;
      p2=p2->next;
     }

     
     
     p2=head2;
     while(p1->next!=NULL)//多项式减法运算
     {
      int jishu=0,jishu2;
       p2=head2;
      while(p2->next!=NULL)
      {
                jishu2=0;
       if(strcmp(p1->zimu,p2->zimu)==0)
        {
         for(int i=0;i<strlen(p1->zimu);i++)
           if(p1->cishu[i]!=p2->cishu[i])
          {
           jishu2=1;
                          break;
          }
         
         if(jishu2==0)
         {
           p3->xishu=p1->xishu-p2->xishu;
              for(int i=0;i<strlen(p1->zimu);i++)
              p3->cishu[i]=p1->cishu[i];
           p2->mark=1;
           strcpy(p3->zimu,p1->zimu);
           jishu=1;
           n1++;

          
         }
        }
             
        p2=p2->next;
      }
      
      
      if(jishu==0)
       {
        p3->xishu=p1->xishu;
           for(int i=0;i<strlen(p1->zimu);i++)
        p3->cishu[i]=p1->cishu[i];
                 strcpy(p3->zimu,p1->zimu);
        n1++;
        }
        p3->next=(struct Queue3 *)malloc(LEN3);
        p3=p3->next;
        p1=p1->next;
     }
     p3->next=NULL;
     
     
     

     p2=head2;
     while(p2->next!=NULL)
     {
      if(p2->mark==0)
      {
       p3->xishu=p2->xishu;
          for(int i=0;i<strlen(p2->zimu);i++)
       p3->cishu[i]=p2->cishu[i];
       strcpy(p3->zimu,p2->zimu);
       n1++;
       p3->next=(struct Queue3 *)malloc(LEN3);
          p3=p3->next;
      }
         p2=p2->next;
     }
     p3->next=NULL;
        p3=head3;
     int num=1;
      printf("两个多项式相减的结果为:\n");
      while(p3->next!=NULL)
     {
      
        printf("%.0lf*",p3->xishu);
        for(int i=0;i<strlen(p3->zimu);i++)
        {
         cout<<p3->zimu[i]<<"("<<p3->cishu[i]<<")";
        }
        if(num!=n1&&p3->next->xishu>0)
        cout<<"+";
        p3=p3->next;
        num++;
     }
    cout<<endl;
    }


    void MulQueue(struct Queue1 *E,struct Queue2 *F)//多项式乘法
    {
        struct Queue1 *head1,*p1;
     struct Queue2 *head2,*p2;
     struct Queue3 *head3,*p3;
     head3=p3=(struct Queue3 *)malloc(LEN3);
        head1=p1=E;
     head2=p2=F;
     int n1=0,m1=0;
     while(p2->next!=NULL)//设立标志位,在这里仅仅是为了初始化,没有什么实际作用!
     {  
      p2->mark=0;
      p2=p2->next;
     }

     
     
       p2=head2;
        while(p1->next!=NULL)//现将第一个多项式的每项都乘以第二个多项式
     {
      p2=head2;
      while(p2->next!=NULL)
      {  
       p3->mark=0;
       p3->xishu=p2->xishu*p1->xishu;
       strcpy(p3->zimu,p1->zimu);
       strcat(p3->zimu,p2->zimu);
       int length1=strlen(p1->zimu);
       int length2=strlen(p2->zimu);
       for(int i=0;i<length1;i++)
           p3->cishu[i]=p1->cishu[i];
       for(int j=0;j<length2;j++)
        p3->cishu[length1+j]=p2->cishu[j];
       for(i=0;i<length1;i++)//处理没个多项式乘完后的重复问题
       {   
        for(int j=length1;j<length1+length2;j++)
        
         if(p3->zimu[i]==p3->zimu[j])
         {
          p3->cishu[i]=p3->cishu[i]+p3->cishu[j];
          for(int k=j;k<strlen(p3->zimu)-1;k++)
          {
           p3->zimu[k]=p3->zimu[k+1];
           p3->cishu[k]=p3->cishu[k+1];
                  
          }
           p3->mark++;
        }
       }
        
       p3->next=(struct Queue3 *)malloc(LEN3);
       p3=p3->next;
       p2=p2->next;
      }
      p1=p1->next;
     }
     p3->next=NULL;
       
     p3=head3;
     printf("两个多项式相乘的结果为:\n");
     while(p3->next!=NULL)
     {
      
        printf("%.0lf*",p3->xishu);
        for(int i=0;i<strlen(p3->zimu)-p3->mark;i++)
        {
         cout<<p3->zimu[i]<<"("<<p3->cishu[i]<<")";
        }
        if(p3->next->next!=NULL&&p3->next->xishu>0)
        cout<<"+";
        p3=p3->next;
     }
    cout<<endl;
    }


    void DivQueue(struct Queue1 *G,struct Queue2 *H)//多项式除法
    {
       struct Queue1 *head1,*p1;
       struct Queue2 *head2,*p2;
        head1=p1=G;
     head2=p2=H;
        printf("两个多项式相除的结果为:\n");
     while(p1->next!=NULL)
     {
      
        printf("%.0lf*",p1->xishu);
        for(int i=0;i<strlen(p1->zimu);i++)
        {
         cout<<p1->zimu[i]<<"("<<p1->cishu[i]<<")";
        }
        if(p1->next->next!=NULL&&p1->next->xishu>0)
        cout<<"+";
        p1=p1->next;
     }
        cout<<endl;
     printf("____________________________________\n");
     while(p2->next!=NULL)
     {
      
        printf("%.0lf*",p2->xishu);
        for(int i=0;i<strlen(p2->zimu);i++)
        {
         cout<<p2->zimu[i]<<"("<<p2->cishu[i]<<")";
        }
        if(p2->next->next!=NULL&&p2->next->xishu>0)
        cout<<"+";
        p2=p2->next;
     }
    cout<<endl;
    }

  • 相关阅读:
    PHP如何获取内网IP
    开源的世界并不纯净
    在linux下玩上了第一人称射击
    终于,在linux下上网了
    我的理想
    vista是什么
    我傻了一阵子
    又是大端小端!!!
    谈谈最近的编程状态
    如何快速发布你的C++Builder程序
  • 原文地址:https://www.cnblogs.com/xiohao/p/2995330.html
Copyright © 2011-2022 走看看