帮我写多项式乘法的代码
时间: 2023-04-02 11:03:55 浏览: 95
当然可以,以下是多项式乘法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
int main()
{
int n, m, a[MAXN], b[MAXN], c[MAXN*2];
// 读入多项式 A
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
// 读入多项式 B
scanf("%d", &m);
for (int i = ; i <= m; i++)
scanf("%d", &b[i]);
// 多项式乘法
for (int i = ; i <= n+m; i++)
c[i] = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
c[i+j] += a[i] * b[j];
// 输出结果
printf("%d", c[]);
for (int i = 1; i <= n+m; i++)
printf(" %d", c[i]);
printf("\n");
return ;
}
```
希望能够帮到你!
相关问题
两个一元多项式乘法代码
下面是Python实现的两个一元多项式乘法代码示例:
1. 使用列表存储一元多项式
```python
def poly_mult(poly1, poly2):
"""
一元多项式乘法,使用列表存储多项式系数
:param poly1: 多项式1,如 [3, 2, 1] 表示 3x^2 + 2x + 1
:param poly2: 多项式2,如 [4, 2] 表示 4x + 2
:return: 乘积多项式,如 [12, 14, 4, 1] 表示 12x^3 + 14x^2 + 4x + 1
"""
m, n = len(poly1), len(poly2)
res = [0] * (m + n - 1)
for i in range(m):
for j in range(n):
res[i+j] += poly1[i] * poly2[j]
return res
```
2. 使用字典存储一元多项式
```python
def poly_mult(poly1, poly2):
"""
一元多项式乘法,使用字典存储多项式系数
:param poly1: 多项式1,如 {2: 3, 1: 2, 0: 1} 表示 3x^2 + 2x + 1
:param poly2: 多项式2,如 {1: 4, 0: 2} 表示 4x + 2
:return: 乘积多项式,如 {3: 12, 2: 14, 1: 4, 0: 1} 表示 12x^3 + 14x^2 + 4x + 1
"""
res = {}
for i, a in poly1.items():
for j, b in poly2.items():
res[i+j] = res.get(i+j, 0) + a * b
return res
```
这两个函数的输入参数都是两个多项式,其中`poly1`和`poly2`可以用列表或字典表示。输出结果也是一个多项式,同样用列表或字典表示。其中,`poly_mult`函数使用的是暴力算法,时间复杂度为$O(mn)$,其中$m$和$n$分别为两个多项式的项数。如果使用更高效的Karatsuba算法可以将时间复杂度降为$O(n^{\log_2 3})$。
C语言实现两个一元多项式乘法代码
```
#include <stdio.h>
#include <stdlib.h>
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
};
Polynomial ReadPoly();
Polynomial Add(Polynomial P1, Polynomial P2);
Polynomial Multiply(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);
int main()
{
Polynomial P1, P2, PP, PS;
P1 = ReadPoly();
P2 = ReadPoly();
PP = Multiply(P1, P2);
PrintPoly(PP);
return 0;
}
Polynomial ReadPoly()
{
int N, c, e;
Polynomial P, Rear, Tmp;
scanf("%d", &N);
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while (N--) {
scanf("%d %d", &c, &e);
Tmp = (Polynomial)malloc(sizeof(struct PolyNode));
Tmp->coef = c;
Tmp->expon = e;
Tmp->link = NULL;
Rear->link = Tmp;
Rear = Tmp;
}
Tmp = P; /* 删除多余的头结点 */
P = P->link;
free(Tmp);
return P;
}
Polynomial Add(Polynomial P1, Polynomial P2)
{
Polynomial Front, Rear, Temp;
int sum;
Rear = (Polynomial)malloc(sizeof(struct PolyNode));
Front = Rear;
while (P1 && P2) {
if (P1->expon == P2->expon) {
sum = P1->coef + P2->coef;
if (sum) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = sum;
Temp->expon = P1->expon;
Rear->link = Temp;
Rear = Rear->link;
}
P1 = P1->link;
P2 = P2->link;
} else if (P1->expon > P2->expon) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P1->coef;
Temp->expon = P1->expon;
Rear->link = Temp;
Rear = Rear->link;
P1 = P1->link;
} else {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P2->coef;
Temp->expon = P2->expon;
Rear->link = Temp;
Rear = Rear->link;
P2 = P2->link;
}
}
while (P1) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P1->coef;
Temp->expon = P1->expon;
Rear->link = Temp;
Rear = Rear->link;
P1 = P1->link;
}
while (P2) {
Temp = (Polynomial)malloc(sizeof(struct PolyNode));
Temp->coef = P2->coef;
Temp->expon = P2->expon;
Rear->link = Temp;
Rear = Rear->link;
P2 = P2->link;
}
Rear->link = NULL;
Temp = Front;
Front = Front->link;
free(Temp);
return Front;
}
Polynomial Multiply(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, Tmp, t1, t2;
int c, e;
if (!P1 || !P2) return NULL;
t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
Rear = P;
while (t2) { /* 先用P1的第1项乘以P2,得到P */
c = t1->coef * t2->coef;
e = t1->expon + t2->expon;
if (c) {
Tmp = (Polynomial)malloc(sizeof(struct PolyNode));
Tmp->coef = c;
Tmp->expon = e;
Rear->link = Tmp;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
while (t1) { /* P1的第2项开始分别乘以P2,得到各项插入P中 */
t2 = P2; Rear = P;
while (t2) {
c = t1->coef * t2->coef;
e = t1->expon + t2->expon;
while (Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if (Rear->link && Rear->link->expon == e) {
if (Rear->link->coef + c)
Rear->link->coef += c;
else {
Tmp = Rear->link;
Rear->link = Tmp->link;
free(Tmp);
}
} else {
Tmp = (Polynomial)malloc(sizeof(struct PolyNode));
Tmp->coef = c;
Tmp->expon = e;
Tmp->link = Rear->link;
Rear->link = Tmp;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
Tmp = P; P = P->link; free(Tmp);
return P;
}
void PrintPoly(Polynomial P)
{
int flag = 0;
if (!P) {
printf("0 0\n");
return;
}
while (P) {
if (!flag)
flag = 1;
else
printf(" ");
printf("%d %d", P->coef, P->expon);
P = P->link;
}
printf("\n");
}
```