• 线性结构2 一元多项式的乘法与加法运算


    题目: https://pintia.cn/problem-sets/1268384564738605056/problems/1271415149946912769

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

    输入格式:

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


    题解: https://blog.csdn.net/the_victory/article/details/52621085
    代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node *PolyNode;
    struct node{
        int coef;
        int expo;
        PolyNode pnode;
    };
    
    PolyNode readPoly()
    {
        PolyNode p,tmp,rear;
        int n,c,e;
        scanf("%d",&n);
        p = (PolyNode)malloc(sizeof(struct node));
        p->coef=p->expo=0;
        p->pnode=NULL;
        rear = p;
        if(n==0){
        return p;
        }
        while(n--){
            scanf("%d %d",&c,&e);
            tmp = (PolyNode)malloc(sizeof(struct node));
            tmp->coef=c;
            tmp->expo=e;
            rear->pnode=tmp;
            tmp->pnode=NULL;
            rear=tmp;
        }
        return p;
    }
    
    int printPoly(PolyNode p)
    {
        int flag=0;
        if(!(p->pnode)){
            printf("0 0
    ");
            return 0;
        }else{
            p=p->pnode;
        }
        while(p){
        if(!flag){
            flag+=1;
        }else{
            printf(" ");
        }
        printf("%d %d",p->coef,p->expo);
        p=p->pnode;
        }
        printf("
    ");
        return 0;
    }
    
    void attach(int coef, int expo, PolyNode *pRear)
    {
        PolyNode tmp;
        tmp = (PolyNode)malloc(sizeof(struct node));
        tmp->coef=coef;
        tmp->expo=expo;
        tmp->pnode=NULL;
        (*pRear)->pnode=tmp;
        *pRear = tmp;
    }
    
    PolyNode mult(PolyNode p1, PolyNode p2)
    {
        PolyNode p,Rear,t1,t2,t;
        int c, e;
        t1 = p1->pnode;
        t2 = p2->pnode;
        p = (PolyNode)malloc(sizeof(struct node));
        p->coef = p->expo = 0;
        p->pnode = NULL;
        Rear = p;
        if(!t1||!t2)return p;
        while(t2){
            c = t1->coef*t2->coef;
            e = t1->expo+t2->expo;
            attach(c,e,&Rear);
            t2 = t2->pnode;
        }
        t1=t1->pnode;
        while(t1){
            t2=p2->pnode;Rear=p;
            while(t2){
                c = t1->coef*t2->coef;
                e = t1->expo+t2->expo;
                while(Rear->pnode&&Rear->pnode->expo>e){
                    Rear = Rear->pnode;
                }
                if(Rear->pnode&&Rear->pnode->expo==e){
                    if(Rear->pnode->coef+c){
                        Rear->pnode->coef+=c;
                    }else{
                        t = Rear->pnode;
                        Rear->pnode = t->pnode;
                        free(t);
                    }
                }else{
                    t = (PolyNode)malloc(sizeof(struct node));
                    t->coef = c;
                    t->expo = e;
                    t->pnode = Rear->pnode;
                    Rear->pnode = t;
                    Rear=Rear->pnode;
                }
                t2=t2->pnode;
            }
            t1=t1->pnode;
        }
        return p;
    }
    
    int compare(int a,int b)
    {
        if(a>b)return 1;
        if(a==b)return 0;
        return -1;
    }
    
    PolyNode plus(PolyNode p1, PolyNode p2)
    {
        PolyNode p,rear,tmp;
        int sum;
        p = (PolyNode)malloc(sizeof(struct node));
        p->pnode=NULL;
        rear=p;
        p1=p1->pnode;
        p2=p2->pnode;
        while(p1&&p2)
            switch(compare(p1->expo,p2->expo)){
                case 1:
                    attach(p1->coef,p1->expo,&rear);
                    p1=p1->pnode;
                    break;
                case -1:
                    attach(p2->coef,p2->expo,&rear);
                    p2=p2->pnode;
                    break;
                case 0:
                    sum = p1->coef+p2->coef;
                    if(sum)attach(sum,p1->expo,&rear);
                    p1=p1->pnode;
                    p2=p2->pnode;
                    break;
    
            }
    
        for(;p1;p1=p1->pnode)attach(p1->coef,p1->expo,&rear);
        for(;p2;p2=p2->pnode)attach(p2->coef,p2->expo,&rear);
        rear->pnode=NULL;
        return p;
    }
    
    int main()
    {
        PolyNode mul,plu,p1,p2;
        p1 = readPoly();
        p2 = readPoly();
        mul = mult(p1,p2);
        plu = plus(p1,p2);
        printPoly(mul);
        printPoly(plu);
        return 0;
    }
  • 相关阅读:
    Jetty 入门
    Spring MVC 学习 之
    Spring MVC 学习 之
    Spring MVC 学习 之
    call apply 使用
    maven学习系列 之 常见问题
    SQL Server数据库partition by 与ROW_NUMBER()函数使用详解[转]
    .NET 同步 异步 委托
    常用JS方法
    通过 NPOI 生成 Excel
  • 原文地址:https://www.cnblogs.com/simon-chou/p/13619844.html
Copyright © 2020-2023  润新知