zoukankan      html  css  js  c++  java
  • 1009 Product of Polynomials (25分)

    This time, you are supposed to find A×B where A and B are two polynomials.

    Input Specification:

    Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:

    N1​​ aN1​​​​ N2​​ aN2​​​​ ... NK​​ aNK​​​​

    where K is the number of nonzero terms in the polynomial, Ni​​ and aNi​​​​ (,) are the exponents and coefficients, respectively. It is given that 1, 0.

    Output Specification:

    For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.

    Sample Input:

    2 1 2.4 0 3.2
    2 2 1.5 1 0.5
     

    Sample Output:

    3 3 3.6 2 6.0 1 1.6
    方法一:链表法(不建议使用
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<string.h>
    using namespace std;
    //多项式相乘与相加 
    const int maxn=110010;
    
    typedef struct Node{
        int expon;
        double coef;
        struct Node *next;    
    }node,*pNode;
    
    pNode ReadPoly(pNode p){
        int K;
        pNode q,r;
        scanf("%d",&K);
        p=new node;
        p->next=NULL;
        r=p;
        while(K--){
            q=new node;
            scanf("%d %lf",&q->expon,&q->coef);
            r->next=q;
            r=r->next;
        }
        r->next=NULL;
        return p;
    } 
    void printPoly(pNode p){
        pNode q,r;
        int k=0;
        r=p->next;
        while(r)
        {
            if(r->coef!=0)
            {
                k++;
            }
            r=r->next;
        }
        printf("%d ",k);
        q=p->next;
        while(q){
            if(q->coef==0){//系数为0,则不必输出 
                q=q->next;
                continue;
            } 
            if(q->next!=NULL)
            {
                printf("%d %.1f ",q->expon,q->coef);
            } 
            else{
                printf("%d %.1f",q->expon,q->coef);
            }
            q=q->next;
        }
        printf("
    ");
    }
    pNode Mult(pNode p1,pNode p2){
        pNode ps,psn,ppp;
        ps=new node;//新链表头部 
        ps->expon=0;
        ps->coef=0;
        ps->next=NULL;
    //    psn=pp;//新链表尾部
        pNode p11,p22;
        p11=p1->next;
        int flog=0;
    //    p22=p2->next;
        while(p11){
             p22=p2->next;//返回链表第一个结点 
            while(p22){
                ppp=new node;
                ppp->expon=p11->expon+p22->expon;
                ppp->coef=p11->coef*p22->coef;
                psn=ps;//返回链表头节点 
                flog=0;
                while(psn->next)
                {
                    if(psn->next->expon==ppp->expon){
                        flog=1;
                        break;
                    }
                    else{
                        psn=psn->next;
                    }
                } 
                if(flog==1){
                    psn->next->expon=ppp->expon;
                    psn->next->coef=psn->next->coef+ppp->coef;//注意不要写错哦 
                }
                else{
                    psn->next=ppp;
                    psn=psn->next;
                    psn->next=NULL;
                }
                p22=p22->next;
            }
            p11=p11->next;
        } 
        return ps;
        
    } 
    pNode Add(pNode p1,pNode p2){
        pNode ps,pp1,ppp;//pp指向链表头部,pp1指向链表尾部,ppp指向新节点 
        pNode p11,p22;//p11,p22都指向链表尾部 
        p11=p1->next;
        p22=p2->next;
        ps=new node;
        pp1=ps;
        while(p11&&p22){
            ppp=new node;
            if(p11->expon>p22->expon){
                ppp->expon=p11->expon;
                ppp->coef=p11->coef;
                pp1->next=ppp;
                pp1=pp1->next;
                p11=p11->next;
            }
            else if(p11->expon<p22->expon){
                ppp->expon=p22->expon;
                ppp->coef=p22->coef;
                pp1->next=ppp;
                pp1=pp1->next;
                pp1->next=NULL;
                p22=p22->next;
            }
            else if(p11->expon==p22->expon){
                ppp->expon=p11->expon;
                ppp->coef=p11->coef+p22->coef;
                pp1->next=ppp;
                pp1=pp1->next;
                p11=p11->next;
                p22=p22->next; 
            }
        } 
        if(p11!=NULL){
            pp1->next=p11;
        }
        if(p22!=NULL){
            pp1->next=p22;
        }
        return ps;
    }
    pNode sort(pNode p){//冒泡排序 
        pNode r,t;
        int ti;
        double td;
        r=p->next;
        while(r){
            t=r->next;
            while(t){
                if(t->expon>r->expon){
                ti=t->expon;
                td=t->coef;
                t->expon=r->expon;
                t->coef=r->coef;
                r->expon=ti;
                r->coef=td;            
            }
            t=t->next; 
            }
            r=r->next;
        }
        return p;
    }
    int main(){
        pNode p1,p2,pp,ps;
        p1=ReadPoly(p1);
        p2=ReadPoly(p2);
        pp=Mult(p1,p2);
        pp=sort(pp);
        printPoly(pp);
    //    ps=Add(p1,p2);
    //    pp=sort(pp);
    //    printPoly(ps);
        return 0;
    }

    方法二:利用数组

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<vector> 
    #include<string.h>
    using namespace std;
    const int maxn=101000;
    struct node{
        int expon;
        double coef;
    };
    bool compare(node a,node b){
        return a.expon>b.expon;
    }
    int main(){
        vector<node> p1,p2,p3;
        int m,n,e;
        node nd;
        double c;
        scanf("%d",&m);
        while(m--){
            scanf("%d %lf",&nd.expon,&nd.coef);
            p1.push_back(nd);
        }
        scanf("%d",&n);
        while(n--){
            scanf("%d %lf",&nd.expon,&nd.coef);
            p2.push_back(nd);
        }
        node p;
        int flog=0,k;
        for(int i=0;i<p1.size();i++){
            for(int j=0;j<p2.size();j++){
                p.expon=p1[i].expon+p2[j].expon;
                p.coef=p1[i].coef*p2[j].coef;
                flog=0;
                for(k=0;k<p3.size();k++){
                    if(p3[k].expon==p.expon){
                        flog=1;
                        p3[k].coef=p3[k].coef+p.coef;
                        break;
                    }
                }
                if(flog==0){
                    p3.push_back(p);
                }
            }
        }
        sort(p3.begin(),p3.end(),compare);
        int t=0;
        for(int i=0;i<p3.size();i++){
            if(p3[i].coef!=0){
                t++;
            } 
        } 
        printf("%d ",t);
        for(int i=0;i<p3.size();i++){
            if(p3[i].coef==0){
                continue;
            }
            if(i<p3.size()-1)
            printf("%d %.1f ",p3[i].expon,p3[i].coef);
            else{
                printf("%d %.1f",p3[i].expon,p3[i].coef);
            }
        }
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    Nginx的配置文件详解(超详细)
    淘宝地址爬取及UI展示
    点击观看
    winform picturebox设置布局样式
    vs的一个不经常用的快捷键
    C# 开发windows服务
    winform窗体置顶
    C# mysql set和enum属性字段的读取和添加
    winform窗体绑定监控键盘事件
    html5创建的sqlite存放为止以及在手机中的位置
  • 原文地址:https://www.cnblogs.com/dreamzj/p/14284553.html
Copyright © 2011-2022 走看看