[PTA]一元多项式运算器

10 篇文章 11 订阅
9 篇文章 0 订阅

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 = 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的项时
            q->coef = -q->coef;
            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的项与下一项中间时
            q->coef = -q->coef;
//            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;
        List qq = q;
        while(qq) {
            qq->coef = - qq->coef;
            qq = qq->next;
        }
    }
    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);
}

4. 一元多项式运算器——乘法

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

输入格式:

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

输出格式:

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

输入样例:

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

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

输出样例:

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

42X-34X^7+56X^8-16X^13-64X^14
//结尾无空行

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 CopyList (List head) {
    List newHead = (List)malloc(sizeof(Node));
    newHead->next = NULL;
    List p = head->next;
    List p2 = newHead;
    while (p) {
        List new = (List)malloc(sizeof(Node));
        new->coef = p->coef;
        new->expn = p->expn;
        p2->next = new;
        p2 = new;
        p = p->next;
    }
    p2->next = NULL;
    return newHead;
}

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;
}

List Multiply (List head1, List head2) {
    List p2 = head2->next->next;
    List newHead = (List)malloc(sizeof(Node));
    List pp = (List)malloc(sizeof(Node));
    newHead->next = pp;
    pp->next = NULL;
    List p1;
    List head1Pre = CopyList(head1);
    List res = NULL;
    while (p2) {
        p1 = head1->next->next;
        while (p1) {
            p1->coef *= p2->coef;
            p1->expn += p2->expn;
            p1 = p1->next;
        }
        p2 = p2->next;
        res = Plus(head1, newHead);
        newHead = CopyList(head1);
        head1 = CopyList(head1Pre);
    }
    return res;
}

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

5. 一元多项式运算器——求值

对于给定的X值,求出多项式的值。

输入格式:

第一、二行按2.3.1的格式,输入一个多项式; 第三行输入X的值。

输出格式:

输出多项式的值

输入样例:

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

4 
(6,0)(2,3)(8,5)(7,10) 
2 
//结尾无空行

输出样例:

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

7446
//结尾无空行

Answer:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.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;
}

int Calculate(List head, int X) {
    List q = head->next->next;
    if(!q) {
        return 0;
    }
    int r = 0;
    while(q) {
        r += q->coef * pow(X, q->expn);
        q = q->next;
    }
    return r;
}

int main() {
    int i, X;
    scanf("%d", &i);
    List head;
    head = Creat(i);
    scanf("%d", &X);
    int result = Calculate(head, X);
    printf("%d\n", result);
}

6. 一元多项式运算器——求导

实现多项式的求导运算

输入格式:

第一、二行按2.3.1的格式,输入一个多项式;

输出格式:

按2.3.1的格式,输出其导数多项式。

输入样例:

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

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

输出样例:

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

2+56X^6+60X^14
//结尾无空行

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++;
    }
}

void Process(List head) {
    List pre = head->next;
    while (pre->next) {
        if (pre->next && pre->next->expn == 0) {
            pre->next = pre->next->next;
        }
        pre = pre->next;
        pre->coef *= pre->expn;
        pre->expn--;
    }
}

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

大家不要把答案直接复制过去哦🤫,要自己思考一下呢!!!

  • 12
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
数据结构是计算机科学中研究数据组织、存储和管理的一门学科。一元多项式是数学中的概念,它由一个变量和对应的系数构成。一元多项式运算器是一个能够对一元多项式进行各种运算的程序或工具。 在Java中实现一元多项式运算器,可以使用链表或数组等数据结构来表示和存储多项式。以下是一个简单的示例代码: ```java import java.util.*; class Term { int coefficient; int exponent; public Term(int coefficient, int exponent) { this.coefficient = coefficient; this.exponent = exponent; } } class Polynomial { List<Term> terms; public Polynomial() { terms = new ArrayList<>(); } public void addTerm(int coefficient, int exponent) { terms.add(new Term(coefficient, exponent)); } public Polynomial add(Polynomial other) { Polynomial result = new Polynomial(); result.terms.addAll(this.terms); for (Term term : other.terms) { boolean found = false; for (Term existingTerm : result.terms) { if (existingTerm.exponent == term.exponent) { existingTerm.coefficient += term.coefficient; found = true; break; } } if (!found) { result.terms.add(term); } } return result; } public Polynomial multiply(Polynomial other) { Polynomial result = new Polynomial(); for (Term term1 : this.terms) { for (Term term2 : other.terms) { int coefficient = term1.coefficient * term2.coefficient; int exponent = term1.exponent + term2.exponent; result.addTerm(coefficient, exponent); } } return result; } public void print() { for (Term term : terms) { System.out.print(term.coefficient + "x^" + term.exponent + " + "); } System.out.println(); } } public class PolynomialCalculator { public static void main(String[] args) { Polynomial p1 = new Polynomial(); p1.addTerm(2, 3); p1.addTerm(4, 2); p1.addTerm(1, 0); Polynomial p2 = new Polynomial(); p2.addTerm(3, 2); p2.addTerm(1, 1); p2.addTerm(5, 0); Polynomial sum = p1.add(p2); Polynomial product = p1.multiply(p2); System.out.println("Sum:"); sum.print(); System.out.println("Product:"); product.print(); } } ``` 这个示例代码实现了一个简单的一元多项式运算器,可以进行多项式的加法和乘法运算。你可以根据需要扩展该代码,添加其他运算功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值