Python实现一元多项式的加减乘除

Python实现一元多项式的加减乘除

一元多项式Am(x)和Bn(X),的加法、减法和乘法运算。其中多项式描述为:
Am(x)=A0+A1x1+A2x2+A3x3+….+Amxm;
Bn(x)=B0+B1x1+B2x2+B3x3+….+Bnxn。

python

运行效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCqt8CV9-1720826883199)(https://i-blog.csdnimg.cn/direct/a1212b33887940f785b27e1743716e37.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ERAd0i8w-1720826883200)(https://i-blog.csdnimg.cn/direct/6d429a5b87794956b7db4119ea2ee106.png)]

代码

class Polynomial:
    def __init__(self):
        self.terms = {}
    def add_term(self, coef, exp):
        if exp in self.terms:
            self.terms[exp] += coef
        else:
            self.terms[exp] = coef
    def print_polynomial(self):
        if not self.terms:
            print("0")
            return
        terms_str = []
        for exp in sorted(self.terms, reverse=True):
            coef = self.terms[exp]
            if coef == 0:  # Skip zero coefficients
                continue
            elif exp == 0:
                terms_str.append(f"{coef}")
            elif exp == 1:
                terms_str.append(f"{coef}x" if coef != 1 else "x")
            else:
                terms_str.append(f"{coef}x^{exp}" if coef != 1 else f"x^{exp}")
        polynomial_str = " + ".join(terms_str).replace("+ -", "- ")
        print(polynomial_str)
    def add_polynomials(self, poly1, poly2):
        result = Polynomial()
        result.terms = poly1.terms.copy()
        for exp, coef in poly2.terms.items():
            if exp in result.terms:
                result.terms[exp] += coef
            else:
                result.terms[exp] = coef
        return result
    def subtract_polynomials(self, poly1, poly2):
        result = Polynomial()
        result.terms = poly1.terms.copy()
        for exp, coef in poly2.terms.items():
            if exp in result.terms:
                result.terms[exp] -= coef
            else:
                result.terms[exp] = -coef
        return result
    def multiply_polynomials(self, poly1, poly2):
        result = Polynomial()
        for exp1, coef1 in poly1.terms.items():
            for exp2, coef2 in poly2.terms.items():
                new_coef = coef1 * coef2
                new_exp = exp1 + exp2
                if new_exp in result.terms:
                    result.terms[new_exp] += new_coef
                else:
                    result.terms[new_exp] = new_coef
        return result

poly1 = Polynomial()
poly2 = Polynomial()
print("第一个多项式")
while True:
    try:
        line = input()
        if line.strip() == "":
            break
        coef, exp = map(int, line.split())
        poly1.add_term(coef, exp)
    except EOFError:
        break
print("第二个多项式")
while True:
    try:
        line = input()
        if line.strip() == "":
            break
        coef, exp = map(int, line.split())
        poly2.add_term(coef, exp)
    except EOFError:
        break
print("多项式一:", end=" ")
poly1.print_polynomial()
print("多项式二:", end=" ")
poly2.print_polynomial()
sum_poly = poly1.add_polynomials(poly1, poly2)
print("和:", end=" ")
sum_poly.print_polynomial()
diff_poly = poly1.subtract_polynomials(poly1, poly2)
print("差:", end=" ")
diff_poly.print_polynomial()
product_poly = poly1.multiply_polynomials(poly1, poly2)
print("积:", end=" ")
product_poly.print_polynomial()
  • add_term(self, coef, exp):
    这个方法用于向多项式中添加一个新的项。它以系数coef和指数exp作为参数,将新的项添加到self.terms字典中。如果已经存在相同指数的项,则将其系数累加到现有项上。
  • print_polynomial(self):
    这个方法用于打印多项式的字符串表示。它首先检查self.terms是否为空,如果为空则直接打印"0"。然后遍历self.terms中的所有项,并根据系数和指数构建出多项式的字符串表示。最后打印出整个多项式的字符串表示。
  • add_polynomials(self, poly1, poly2):
    这个方法用于将两个多项式相加。它创建一个新的Polynomial对象result,并将poly1的所有项复制到result.terms中。然后遍历poly2的所有项,如果result.terms中已经存在相同指数的项,则将其系数累加到该项上;否则,将新的项添加到result.terms中。最后,返回相加后的结果多项式result。
  • subtract_polynomials(self, poly1, poly2):
    这个方法用于将两个多项式相减。它的实现与add_polynomials方法类似,但在处理poly2的项时,将其系数减去而不是相加。最后,返回相减后的结果多项式result。
  • multiply_polynomials(self, poly1, poly2):
    这个方法用于将两个多项式相乘。它创建一个新的Polynomial对象result,并遍历poly1和poly2的所有项,计算出新项的系数和指数。新项的系数是poly1项的系数与poly2项的系数相乘,新项的指数是poly1项的指数与poly2项的指数相加。如果result.terms中已经存在相同指数的项,则将新的系数累加到该项上;否则,将新的项添加到result.terms中。最后,返回相乘后的结果多项式result。

C语言

运行效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFvKVE5o-1720826883201)(https://i-blog.csdnimg.cn/direct/61dc05f295594979a1e5ce1f4de960c4.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4xcjvnck-1720826883201)(https://i-blog.csdnimg.cn/direct/cfc1294f666241c78dcf5afb30c3b9f3.png)]

代码

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

// ����ʽ��㶨��
typedef struct PolyNode {
    int coef;  // ϵ��
    int exp;   // ָ��
    struct PolyNode* next;
} PolyNode;

// ����ʽ������
typedef struct {
    PolyNode* head;
} Polynomial;

// ��ʼ������ʽ����
void initPolynomial(Polynomial* poly) {
    poly->head = (PolyNode*)malloc(sizeof(PolyNode));
    poly->head->next = NULL;
}

// �ͷŶ���ʽ������ڴ�
void freePolynomial(Polynomial* poly) {
    PolyNode* p = poly->head;
    while (p != NULL) {
        PolyNode* temp = p->next;
        free(p);
        p = temp;
    }
}

// �ڶ���ʽ����ĩβ�����½��
void insertTerm(Polynomial* poly, int coef, int exp) {
    PolyNode* newNode = (PolyNode*)malloc(sizeof(PolyNode));
    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = NULL;

    PolyNode* p = poly->head;
    while (p->next != NULL) {
        p = p->next;
    }
    p->next = newNode;
}

// ��ӡ����ʽ
void printPolynomial(Polynomial* poly) {
    PolyNode* p = poly->head->next;
    int isFirstTerm = 1;

    while (p != NULL) {
        if (!isFirstTerm && p->coef > 0) {
            printf(" + ");
        }
        if (p->exp == 0) {
            printf("%d", p->coef);
        } else if (p->exp == 1) {
            printf("%dx", p->coef);
        } else {
            printf("%dx^%d", p->coef, p->exp);
        }

        isFirstTerm = 0;
        p = p->next;
    }
    printf("\n");
}

// ����ʽ���
Polynomial addPolynomials(Polynomial* poly1, Polynomial* poly2) {
    Polynomial result;
    initPolynomial(&result);

    PolyNode* p1 = poly1->head->next;
    PolyNode* p2 = poly2->head->next;

    while (p1 != NULL && p2 != NULL) {
        if (p1->exp < p2->exp) {
            insertTerm(&result, p1->coef, p1->exp);
            p1 = p1->next;
        } else if (p1->exp > p2->exp) {
            insertTerm(&result, p2->coef, p2->exp);
            p2 = p2->next;
        } else {
            int sum = p1->coef + p2->coef;
            if (sum != 0) {
                insertTerm(&result, sum, p1->exp);
            }
            p1 = p1->next;
            p2 = p2->next;
        }
    }

    while (p1 != NULL) {
        insertTerm(&result, p1->coef, p1->exp);
        p1 = p1->next;
    }

    while (p2 != NULL) {
        insertTerm(&result, p2->coef, p2->exp);
        p2 = p2->next;
    }

    return result;
}

// ����ʽ���
Polynomial subtractPolynomials(Polynomial* poly1, Polynomial* poly2) {
    Polynomial result;
    initPolynomial(&result);

    PolyNode* p1 = poly1->head->next;
    PolyNode* p2 = poly2->head->next;

    while (p1 != NULL && p2 != NULL) {
        if (p1->exp < p2->exp) {
            insertTerm(&result, p1->coef, p1->exp);
            p1 = p1->next;
        } else if (p1->exp > p2->exp) {
            insertTerm(&result, -p2->coef, p2->exp);
            p2 = p2->next;
        } else {
            int diff = p1->coef - p2->coef;
            if (diff != 0) {
                insertTerm(&result, diff, p1->exp);
            }
            p1 = p1->next;
            p2 = p2->next;
        }
    }

    while (p1 != NULL) {
        insertTerm(&result, p1->coef, p1->exp);
        p1 = p1->next;
    }

    while (p2 != NULL) {
        insertTerm(&result, -p2->coef, p2->exp);
        p2 = p2->next;
    }

    return result;
}

// ����ʽ���
Polynomial multiplyPolynomials(Polynomial* poly1, Polynomial* poly2) {
    Polynomial result;
    initPolynomial(&result);

    PolyNode* p1 = poly1->head->next;

    while (p1 != NULL) {
        PolyNode* p2 = poly2->head->next;
        Polynomial temp;
        initPolynomial(&temp);

        while (p2 != NULL) {
            int coef = p1->coef * p2->coef;
            int exp = p1->exp + p2->exp;
            insertTerm(&temp, coef, exp);
            p2 = p2->next;
        }

        result = addPolynomials(&result, &temp);
        freePolynomial(&temp);

        p1 = p1->next;
    }

    return result;
}

int main() {
    Polynomial poly1, poly2;
    initPolynomial(&poly1);
    initPolynomial(&poly2);

    // �Ӽ����������ʽ1��ϵ����ָ���������뵽������
    printf("Enter polynomial 1 (coefficients and exponents):\n");
    int coef, exp;
    while (scanf("%d%d", &coef, &exp) == 2) {
        insertTerm(&poly1, coef, exp);
    }

    getchar();  // ������뻺�����Ļ��з�

    // �Ӽ����������ʽ2��ϵ����ָ���������뵽������
    printf("Enter polynomial 2 (coefficients and exponents):\n");
    while (scanf("%d%d", &coef, &exp) == 2) {
        insertTerm(&poly2, coef, exp);
    }

    printf("Polynomial 1: ");
    printPolynomial(&poly1);

    printf("Polynomial 2: ");
    printPolynomial(&poly2);

    Polynomial sum = addPolynomials(&poly1, &poly2);
    printf("Sum: ");
    printPolynomial(&sum);

    Polynomial diff = subtractPolynomials(&poly1, &poly2);
    printf("Difference: ");
    printPolynomial(&diff);

    Polynomial product = multiplyPolynomials(&poly1, &poly2);
    printf("Product: ");
    printPolynomial(&product);

    freePolynomial(&poly1);
    freePolynomial(&poly2);
    freePolynomial(&sum);
    freePolynomial(&diff);
    freePolynomial(&product);

    return 0;
}

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一元多项式加减乘除的C语言数组实现: 1. 定义一元多项式的结构体 ```c #define MAXN 1000 // 多项式最大项数 struct Polynomial{ int coef[MAXN]; // 系数数组 int exp[MAXN]; // 指数数组 int len; // 多项式项数 }; ``` 2. 初始化多项式 ```c void InitPoly(Polynomial &P){ memset(P.coef, 0, sizeof(P.coef)); // 初始化系数数组为 0 memset(P.exp, 0, sizeof(P.exp)); // 初始化指数数组为 0 P.len = 0; // 初始化项数为 0 } ``` 3. 多项式加法 ```c void AddPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 int i = 0, j = 0; while(i < A.len && j < B.len){ if(A.exp[i] > B.exp[j]){ // A 中指数较大 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; } else if(A.exp[i] < B.exp[j]){ // B 中指数较大 C.coef[C.len] = B.coef[j]; C.exp[C.len] = B.exp[j]; j++; } else{ // 指数相等 C.coef[C.len] = A.coef[i] + B.coef[j]; C.exp[C.len] = A.exp[i]; i++; j++; } C.len++; } while(i < A.len){ // 将 A 中剩余项加入 C 中 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; C.len++; } while(j < B.len){ // 将 B 中剩余项加入 C 中 C.coef[C.len] = B.coef[j]; C.exp[C.len] = B.exp[j]; j++; C.len++; } } ``` 4. 多项式减法 ```c void SubPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 int i = 0, j = 0; while(i < A.len && j < B.len){ if(A.exp[i] > B.exp[j]){ // A 中指数较大 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; } else if(A.exp[i] < B.exp[j]){ // B 中指数较大 C.coef[C.len] = -B.coef[j]; // 系数取相反数 C.exp[C.len] = B.exp[j]; j++; } else{ // 指数相等 C.coef[C.len] = A.coef[i] - B.coef[j]; C.exp[C.len] = A.exp[i]; i++; j++; } C.len++; } while(i < A.len){ // 将 A 中剩余项加入 C 中 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; C.len++; } while(j < B.len){ // 将 B 中剩余项加入 C 中 C.coef[C.len] = -B.coef[j]; // 系数取相反数 C.exp[C.len] = B.exp[j]; j++; C.len++; } } ``` 5. 多项式乘法 ```c void MulPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 for(int i = 0; i < A.len; i++) for(int j = 0; j < B.len; j++){ int k = A.exp[i] + B.exp[j]; C.coef[k] += A.coef[i] * B.coef[j]; // 累加系数乘积 } for(int i = 0; i < MAXN; i++) if(C.coef[i] != 0){ // 记录非零项 C.exp[C.len] = i; C.len++; } } ``` 6. 多项式除法 ```c void DivPoly(Polynomial A, Polynomial B, Polynomial &Q, Polynomial &R){ InitPoly(Q); // 初始化商多项式为 0 InitPoly(R); // 初始化余数多项式为 0 for(int i = A.len - 1; i >= 0; i--){ // 从高次项开始除 int k = A.exp[i] - B.exp[B.len - 1]; if(k < 0) break; // 除数次数超过被除数 int c = A.coef[i] / B.coef[B.len - 1]; // 计算系数 Q.coef[k] = c; // 存储商系数 Q.exp[Q.len] = k; // 存储商指数 Q.len++; for(int j = 0; j < B.len; j++){ // 减去被除数乘以商 int t = k + B.exp[j]; A.coef[i - B.len + j + 1] -= c * B.coef[j]; } } for(int i = A.len - 1; i >= B.len - 1; i--){ // 存储余数 if(A.coef[i] != 0){ R.coef[R.len] = A.coef[i]; R.exp[R.len] = A.exp[i]; R.len++; } } } ``` 以上就是一元多项式加减乘除的C语言数组实现。需要注意的是,在进行除法运算时,被除数必须是单项式,即只有一项,而除数可以是多项式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鷇韩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值