zoukankan      html  css  js  c++  java
  • 线性结构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;
    }
  • 相关阅读:
    bash 中有效建立锁
    go 语言 Makefile 指定依赖包位置
    在 mysql 中对特定的库禁用 DDL 语句
    go 语言并发机制 goroutine 初探
    Google和facebook如何应用R进行数据挖掘
    数据应用催生商业模式
    4款语音播报来电短信应用[Android]
    让 php 用 nginx 打包 zip
    10个关于 Dropbox 的另类功用(知乎问答精编)[还是转来了]
    分析以数据挖掘技术预测用户流失情况的方法
  • 原文地址:https://www.cnblogs.com/simon-chou/p/13619844.html
Copyright © 2011-2022 走看看