[PTA]一元多项式运算器

Posted Billy Miracle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]一元多项式运算器相关的知识,希望对你有一定的参考价值。

1. 一元多项式运算器——建立与输出

通过键盘接收一组多项式的系数和指数,建立多项式(要求各项按指数升序排列),并按指定格式输出。

输入格式:

第一行输入一个正整数n,表示非零项个数。 第二行输入n对整数,每对形如(7,3),表示系数为7、指数为3的项。

输出格式:

按多项式形式输出,各项按指数升序排列,例如6+2X-7X^8

输入样例:

在这里给出一组输入。例如:

4
(6,0)(2,1)(-8,70)(4,150) 

输出样例:

在这里给出相应的输出。例如:

6+2X-8X^70+4X^150
//结尾无空行

Answer:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct node {
    int coef;
    int expn;
    struct node *next;
}Node, *List;

List Creat(int i) {
    List head;
    head = (List)malloc(sizeof(Node));
    List pre, pnew;
    pre = head;
    char a,b;
    for(int j = 0; j <= i; j++) {
        pnew = (List)malloc(sizeof(Node));
        scanf("%c%d,%d%c", &a, &pnew->coef, &pnew->expn, &b);
        pre -> next = pnew;
        pre = pnew;
    }
    return head;
}

void Print(List head) {
    List q = head->next->next;
    int flag = 1;
    if(!q) {
        putchar('0');
        printf("\\n");
        return;
    }
    while(q) {
        if(q->coef > 0 && flag != 1) {
            putchar('+');
        }
        if(q->coef != 1 && q->coef != -1) {
            printf("%d", q->coef);
            if(q->expn == 1) {
                putchar('X');
            } else if (q->expn) {
                printf("X^%d", q->expn);
            }
        } else {
            if(q->coef == 1) {
                if(!q->expn) {
                    putchar('1');
                } else if (q->expn == 1) {
                    putchar('X');
                } else {
                    printf("X^%d", q->expn);
                }
            }
            if(q->coef == -1) {
                if(!q->expn) {
                    printf("-1");
                } else if(q->expn == 1) {
                    printf("-X");
                } else {
                    printf("-X^%d", q->expn);
                }
            }
        }
        q = q->next;
        flag++;
    }
}

int main() {
    int i;
    scanf("%d", &i);
    List head;
    head = Creat(i);
    Print(head);
}

2. 一元多项式运算器——加法

一元多项式运算器——加法(by Yan)实现两个一元多项式相加运算。

输入格式:

按2.3.1的格式,第一、二行输入一个加数;第三、四行输入另一个加数。

输出格式:

按2.3.1的格式,输出和多项式。

输入样例:

在这里给出一组输入。例如:

5
(6,0)(2,1)(8,7)(4,15)(3,18)
3
(7,1)(2,6)(-8,7)
//结尾无空行

输出样例:

在这里给出相应的输出。例如:

6+9X+2X^6+4X^15+3X^18
//结尾无空行

Answer:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct node {
    int coef;
    int expn;
    struct node *next;
}Node, *List;

List Creat(int i) {
    List head;
    head = (List)malloc(sizeof(Node));
    List pre, pnew;
    pre = head;
    char a,b;
    for(int j = 0; j <= i; j++) {
        pnew = (List)malloc(sizeof(Node));
        scanf("%c%d,%d%c", &a, &pnew->coef, &pnew->expn, &b);
        pre -> next = pnew;
        pre = pnew;
    }
    return head;
}

void Print(List head) {
    List q = head->next->next;
    int flag = 1;
    if(!q) {
        putchar('0');
        printf("\\n");
        return;
    }
    while(q) {
        if(q->coef > 0 && flag != 1) {
            putchar('+');
        }
        if(q->coef != 1 && q->coef != -1) {
            printf("%d", q->coef);
            if(q->expn == 1) {
                putchar('X');
            } else if (q->expn) {
                printf("X^%d", q->expn);
            }
        } else {
            if(q->coef == 1) {
                if(!q->expn) {
                    putchar('1');
                } else if (q->expn == 1) {
                    putchar('X');
                } else {
                    printf("X^%d", q->expn);
                }
            }
            if(q->coef == -1) {
                if(!q->expn) {
                    printf("-1");
                } else if(q->expn == 1) {
                    printf("-X");
                } else {
                    printf("-X^%d", q->expn);
                }
            }
        }
        q = q->next;
        flag++;
    }
}

List Plus(List head1, List head2) {
    List pre = NULL, p = NULL, qre = NULL, q = NULL;
    pre = head1->next;
    p = head1->next->next;
    qre = head2->next;
    q = head2->next->next;
    int index = 1;
    while (p != NULL) {
        if (q == NULL) {
            return head1;
        }
        if (p->expn == q->expn) {
            p->coef = p->coef + q->coef;
            if (p->coef == 0) {
                pre->next = p->next;
                free(p);
                if (pre) {
                    p = pre->next;
                } else {
                    p = NULL;
                }
                qre->next = q->next;
                free(q);
                if (qre) {
                    q = qre->next;
                } else {
                    q = NULL;
                }
            } else {
                pre = p;
                p = p->next;
                qre->next = q->next;
                free(q);
                if (qre) {
                    q = qre->next;
                } else {
                    q = NULL;
                }
            }
//            printf("4\\n");
        } else if (p->expn > q->expn) {//多项式1的项的指数大于多项式2的项时
            qre->next = q->next;
            q->next = p;
            pre->next = q;
            pre = q;
            q = qre->next;
//            printf("3\\n");
        } else if (q->expn > p->expn && p->next &&q->expn < (p->next)->expn) {//多项式2的项指数大小在多项式1的项与下一项中间时
//            printf("1\\n");
            qre->next = q->next;
            pre = p;
            p = p->next;
            q->next = p;
            pre->next = q;
            pre = q;
            q = qre->next;
        } else if (q->expn > p->expn && p->next && q->expn >= (p->next)->expn) {
            pre = p;
            p = p->next;
//            printf("2\\n");
        } else {
            pre = p;
            break;
        }
        index ++;
    }
    if (q) {//多项式2未计算完
        pre->next = q;
    }
    return head1;
}

int main() {
    int i1, i2;
    List head1, head2;
    scanf("%d", &i1);
    head1 = Creat(i1);
    scanf("%d", &i2);
    head2 = Creat(i2);
    List head = Plus(head1, head2);
    Print(head);
}

3. 一元多项式运算器——减法

实现两个一元多项式相减运算。

输入格式:

按2.3.1的格式,第一、二行输入被减数;第三、四行输入减数。

输出格式:

按2.3.1的格式,输出差多项式。

输入样例:

在这里给出一组输入。例如:

4 
(6,0)(2,6)(8,7)(4,15) 
5 
(7,1)(2,6)(-8,7)(10,20)(16,30)
//结尾无空行

输出样例:

在这里给出相应的输出。例如:

6-7X+16X^7+4X^15-10X^20-16X^30
//结尾无空行

Answer:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct node {
    int coef;
    int expn;
    struct node *next;
}Node, *List;

List Creat(int i) {
    List head;
    head = (List)malloc(sizeof(Node));
    List pre, pnew;
    pre = head;
    char a,b;
    for(int j = 0; j <= i; j++) {
        pnew = (List)malloc(sizeof(Node));
        scanf("%c%d,%d%c", &a, &pnew->coef, &pnew->expn, &b);
        pre -> next = pnew;
        pre = pnew;
    }
    return head;
}

void Print(List head) {
    List q = head->next->next;
    int flag = 1;
    if(!q) {
        putchar('0');
        printf("\\n");
        return;
    }
    while(q) {
        if(q->coef > 0 && flag != 1) {
            putchar('+');
        }
        if(q->coef != 1 && q->coef != -1) {
            printf("%d", q->coef);
            if(q->expn == 1) {
                putchar('X');
            } else if (q->expn) {
                printf("X^%d", q->expn);
            }
        } else {
            if(q->coef == 1) {
                if(!q->expn) {
                    putchar('1');
                } else if (q->expn == 1) {
                    putchar('X');
                } else {
                    printf("X^%d", q->expn);
                }
            }
            if(q->coef == -1) {
                if(!q->expn) {
                    printf("-1");
                } else if(q->expn == 1) {
                    printf("-X");
                } else {
                    printf("-X^%d", q->expn);
                }
            }
        }
        q = q->next;
        flag++;
    }
}

List Plus(List head1, List head2) {
    List pre = NULL, p =以上是关于[PTA]一元多项式运算器的主要内容,如果未能解决你的问题,请参考以下文章

PTA 数据结构 一元多项式的乘法与加法运算 (仅供参考,请勿粘贴)

PTA 乙级 1010 一元多项式求导 (25分)

PTA 数据结构 一元多项式求导 (仅供参考)

链表应用:一元多项式运算器。

数据结构和算法-一元多项式运算算法(加法)

PTA Basic Level P1010