#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10000
struct data
{
int coef;//系数
int expn;//指数
};
void Add(struct data D1[], struct data D2[], int n, int m);
void Multiply(struct data D1[], struct data D2[], int n, int m);
int main()
{
struct data D1[MAXSIZE];
struct data D2[MAXSIZE];
int n, m;
scanf("%d\n", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d\n", &D1[i].coef, &D1[i].expn);
}
scanf("%d\n", &m);
for (int i = 0; i < m; i++)
{
scanf("%d %d\n", &D2[i].coef, &D2[i].expn);
}
Add(D1, D2, n, m);
Multiply(D1, D2, n, m);
return 0;
}
void Add(struct data D1[], struct data D2[], int n, int m)//多项式相加
{
int da = 0, db = 0, dc = 0;
struct data D3[MAXSIZE]; //定义一个新的结构体数组,存放多项式相加之和
while (da < n && db < m)//利用while循环遍历数组,中止条件为其中一个数组遍历完成
{
if (D1[da].expn > D2[db].expn)//将指数较小的一项赋给新的结构体数组
{
D3[dc].coef = D2[db].coef;
D3[dc].expn = D2[db].expn;
db++;
dc++;
}
else if (D1[da].expn < D2[db].expn)
{
D3[dc].coef = D1[da].coef;
D3[dc].expn = D1[da].expn;
da++;
dc++;
}
else//若两项的指数相等,则系数相加
{
D3[dc].coef = D1[da].coef + D2[db].coef;
D3[dc].expn = D1[da].expn;
da++;
db++;
dc++;
}
}
if (da == n)//第一个数组率先遍历完成
{
for (int i = db; i < m; i++)
{
D3[dc].coef = D2[i].coef;
D3[dc].expn = D2[i].expn;
dc++;
}
}
else//第二个数组率先遍历完成
{
for (int i = dc; i < n; i++)
{
D3[dc].coef = D1[i].coef;
D3[dc].expn = D1[i].expn;
dc++;
}
}
printf("多项式相加:\n");
for (int i = 0; i < dc; i++)
{
printf("%dX^%d ", D3[i].coef, D3[i].expn);
}
printf("\n");
}
void Multiply(struct data D1[], struct data D2[], int n, int m)//多项式相乘
{
int zhi = 0,xi=0;
int a[MAXSIZE]={0};//数组元素值暂存为0,该数组用于存放相乘之后的多项式的系数
for (int i = 0; i < n; i++)//遍历第一个多项式
{
for (int j = 0; j < m; j++)//遍历第二个多项式
{
zhi = D1[i].expn + D2[j].expn;//两个多项式指数相加
xi = D1[i].coef * D2[j].coef;//两个多项式系数相乘
a[zhi] = xi+a[zhi];//将系数存在下标为其指数值的数组中,并实现累加(关键一步)
}
}
printf("多项式相乘:\n");
for (int i = 0; i < MAXSIZE; i++)
{
if (a[i] != 0)//数组元素为0时跳过
{
printf("%dX^%d ", a[i], i);
}
}
}
一元多项式相加,相乘(顺序表实现)
于 2021-06-27 10:24:12 首次发布