zoukankan      html  css  js  c++  java
  • 简单的一元二项(使用的是指针形式,方便调试)

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

    输入样例:

    4 3 4 -5 2  6 1  -2 0   //其中第一项4表示为输入的项数
    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

    //此程序有一个BUG,在于输入数据P1项少于P2项输出结果才会正确(项数少的排成P1);但是我用排序组合使得P1为项数少的。
    //说明程序有点小BUG,希望有道友能帮我指点出来

    //此程序有一个BUG,在于输入数据P1项少于P2项输出结果才会正确(项数少的排成P1)
    #include<cstdio>
    #include<iostream>
    #include<malloc.h>
    #include <stdlib.h>
    #include<vector>
    using namespace std;
    vector<int>a;
    //创建链表头
    typedef struct Polynomial//PolyNode是结构名,Polynomial是结构体别名
      {
        int cofe;
        int expon;
    struct    Polynomial *link;
    Polynomial():cofe(NULL),expon(NULL),link(NULL){}//构造函数初始化
    }Polynomial;
     void add(int c,int e,Polynomial *PRear)
     {            
                
         
         {     Polynomial *p;
                p=(Polynomial*) malloc(sizeof(Polynomial));
                p->link=NULL;p->cofe=NULL;p->expon=NULL;
                PRear->cofe=c;
                 PRear->expon=e;
                PRear->link=p;
                
         }
        
    
     }
    Polynomial *Polyread()//指针函数
    {
        Polynomial *Rear,*P;
        int c,e,N;
        scanf("%d",&N);//N表示最高阶阶数,如果要加上常数
        a.push_back(N);
        P=(Polynomial*) malloc(sizeof(Polynomial));//之前有个程序通过函数newNode 开辟空间
        P->link=NULL;
        Rear=P;//这一行程序非常重要,用Rear指向其Head头文件,通过P不断增加链表文件,最后Rear地址为最开始地址
            
        while(N--)//N表示输入项数
        {
            //    scanf("%d%d",&c,&e);if(c!=0 &&c!=NULL)//
                if(scanf("%d%d",&c,&e)==2&&c)//--可以让输入DD字符停止不录入到链表中
                {   add(c,e,P);
                     P=P->link;
                }
        }
        //多循环一次是加上常数项
        P->cofe=NULL;
        P->expon=NULL;
        
        return Rear;
    
    }
    
    Polynomial *MultiAdd(Polynomial *p1,Polynomial *p2)
    {
        Polynomial *t1=p1,*t2=p2;//如果将p1,p2设置成指针的话可能好调试
        
        Polynomial *P,*Rear,*t;
        P=(Polynomial*) malloc(sizeof(struct Polynomial ));
        P->link=NULL;
        Rear=P;  //记住首地址
        while(t1->link && t2->link)
        {
            if((t1->expon) < (t2->expon))
            {
                  add(t2->cofe,t2->expon,P);
                  P=P->link;    
                  t2=t2->link;
                    
            }
            else if((t1->expon) > (t2->expon))
            {
                 add(t1->cofe,t1->expon,P);
                  P=P->link;    
                  t1=t1->link;
            }
            else 
            {
                if(t1->cofe==-(t2->cofe))
                {    t1=t1->link; t2=t2->link;
                
                }
                else
                {
                    add((t1->cofe+t2->cofe),t1->expon,P);
                    P=P->link;
                    t1=t1->link; t2=t2->link;
                }
            
            }
        }
        while(t1->link)
        {
            add(t1->cofe,t1->expon,P);
            P=P->link;
            t1=t1->link;
        }
        while(t2->link)
        {
            add(t2->cofe,t2->expon,P);
            P=P->link;
            t2=t2->link;
        }
        //在开头时候必须要加上其最高的阶数
        t=(Polynomial*) malloc(sizeof(struct Polynomial ));
        t->cofe=NULL;
        t->expon=Rear->expon;
        t->link=Rear;
        Rear=t;
        return Rear;
    }
    
    Polynomial *Mult(Polynomial *p1,Polynomial *p2)
    {    Polynomial *t1,*t2;//在这里我是强制将项少的赋予t1
    if(a[0]>=a[1])
        {    
            t1=p2;t2=p1;
            
        }
        else
        {
            t1=p1;t2=p2;
        }
        Polynomial *P,*Rear,*o,*p,*t;
        P=(Polynomial*) malloc(sizeof(struct Polynomial ));
        P->link=NULL;Rear=P;//保存地址
        
        //采用插入乘法
        {
                
            while(t2->link&&t2->cofe!=NULL)
                {    
                    add((t1->cofe*t2->cofe),(t1->expon+t2->expon),P);//将P1第一项与P2各项相乘
                    t2=t2->link;
                    P=P->link;
               }
            t1=t1->link;
            while(t1->link&&t1->cofe!=NULL)
            {
                t2=p2;//开始插入
                p=P;
                while(t2->link&&t1->cofe!=NULL)
                {
                    int e=t1->expon+t2->expon;
                    int c=t1->cofe*t2->cofe;
                
                    while (p->cofe!=NULL&&p->link &&p->link->expon>e)//开始插入
                                p=p->link;//指针不断移动到e大的前一位节点
                    if(p->cofe!=NULL&& p->link&&p->link->expon==e )
                    {
                        if((p->link->cofe+c)!=0)
                            p->link->cofe=c+p->link->cofe;
                        else//表示同指数系数相反,则要把此节点释放
                            {p->link=p->link->link;
                                 
                            //    t=p->link;
                            //    p->link=t->link;
                                //free(t);
                           }
                    }
                    else
                    {        o=(Polynomial*) malloc(sizeof(struct Polynomial ));//申请空间,直接插入
                            if(p->cofe!=NULL)
                            {    
                                o->cofe=c;o->expon=e;o->link=NULL;
                                o->link=p->link;
                                p->link=o;
                                p=p->link;
                        }
                    else
                    {
                        p->cofe=c;
                        p->expon=e;
                        p->link=o;
                        o->cofe=NULL;o->expon=NULL;o->link=NULL;
                    }
                    }
                    t2=t2->link;
                }
                t1=t1->link;
            }
        }
        return Rear;
    }
    
    
    int main()
    {    
        Polynomial *p1,*p2,*pp,*ps;
        
        p1=Polyread();
        p2=Polyread();
    
        pp=MultiAdd(p1,p2);
        ps=Mult(p1,p2);
        return 0;
    }
     
  • 相关阅读:
    Synchronized锁升级
    锁削除和锁粗化
    自旋锁
    Synchronized原理
    浅谈AQS原理
    JSON使用
    JSON语法
    Decode Ways
    String to Integer(atoi)
    Leetcode:Reverse Words in a String
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/5410277.html
Copyright © 2011-2022 走看看