一元多项式的乘法与加法运算
题目描述
设计函数分别求两个一元多项式的乘积与和。
输入格式
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
解题思路:
此题需要解决加法和乘法问题,其中乘法可以拆解为加法。所以主要任务为完成一元多项式的加法运算。
完成加法的方法为同时对两个链表遍历,此题要求按指数降序方式进行排列。所以对两个链表的指数进行比较,将当前指数大的节点的存储到结果中,并向后移一位,如果两个链表当前节点指数相同,则将两者系数相加,如果和不为0则将结果添加在结果链表中,并将二者同时后移。
代码如下:
void Addition(Poly First, Poly Second, Poly &Result) {
Poly* F;
Poly* S;
Poly* R;
R = &Result;
F = &First;
F = F->next;
S = &Second;
S = S->next;
while (F != NULL && S != NULL) {
Poly* L;
if (F->b > S->b) {
L = new Poly;
L->next = NULL;
L->a = F->a;
L->b = F->b;
F = F->next;
R->next = L;
R = L;
}
else if (F->b < S->b) {
L = new Poly;
L->next = NULL;
L->a = S->a;
L->b = S->b;
S = S->next;
R->next = L;
R = L;
}
else {
if (F->a + S->a != 0) {
L = new Poly;
L->next = NULL;
L->a = F->a + S->a;
L->b = F->b;
R->next = L;
R = L;
}
F = F->next;
S = S->next;
}
}
if (F != NULL) {
R->next = F;
}
else {
R->next = S;
}
}
乘法运算的解决方式。可以将第二个的链表的每一个节点分别与第一个链表相乘得到一个链表数组,最终将链表数组中的每一个元素进行相加操作。
代码如下:
void Multiplication(Poly First, Poly Second, Poly& Result) {
Poly* F;
Poly* S;
Poly* R;
Poly Mid[1000];
int i, j;
R = &Result;
F = &First;
S = &Second;
F = F->next;
S = S->next;
for (i = 0; S != NULL; S = S->next, i++) {
Get_Head(Mid[i]);
Poly* L;
L = &Mid[i];
Poly* M = F;
while (M != NULL) {
Poly* P;
P = new Poly;
P->a = M->a * S->a;
P->b = M->b + S->b;
P->next = NULL;
L->next = P;
L = P;
M = M->next;
}
}
if (i == 1) {
R->next = &Mid[0];
}
else {
Poly Mid_R[1000];
Get_Head(Mid_R[0]);
Addition(Mid[0], Mid[1], Mid_R[0]);
int k;
for (j = 2, k = 1; j < i ; j++, k++) {
Get_Head(Mid_R[k]);
Addition(Mid[j], Mid_R[k - 1], Mid_R[k]);
}
Result = Mid_R[k - 1];
}
}
完整代码:
#include<iostream>
using namespace std;
// 链表节点类型
typedef struct Poly{
int a, b;
struct Poly* next;
}Poly;
// 链表头节点的生成
void Get_Head(Poly& Head) {
Poly* L;
L = new Poly;
L->next = NULL;
Head = *L;
}
// 尾插法插入元素
void Get_Elem(Poly& Head) {
Poly* L;
Poly* S;
int n, i, a, b;
cin >> n;
S = &Head;
for (i = 0; i < n; i++) {
L = new Poly;
L->next = NULL;
cin >> a >> b;
if (a != 0) {
L->a = a;
L->b = b;
S->next = L;
S = L;
}
}
}
// 显示这个链表
void ShowLnode(Poly& P) {
Poly* L = &P;
if (L->next != NULL) {
L = L->next;
while (L) {
if (L->next)
cout << L->a << " " << L->b << " ";
else
cout << L->a << " " << L->b << endl;
L = L->next;
}
}
else
cout << 0 << " " << 0 << endl;
}
// 多项式的加法运算
void Addition(Poly First, Poly Second, Poly &Result) {
Poly* F;
Poly* S;
Poly* R;
R = &Result;
F = &First;
F = F->next;
S = &Second;
S = S->next;
while (F != NULL && S != NULL) {
Poly* L;
if (F->b > S->b) {
L = new Poly;
L->next = NULL;
L->a = F->a;
L->b = F->b;
F = F->next;
R->next = L;
R = L;
}
else if (F->b < S->b) {
L = new Poly;
L->next = NULL;
L->a = S->a;
L->b = S->b;
S = S->next;
R->next = L;
R = L;
}
else {
if (F->a + S->a != 0) {
L = new Poly;
L->next = NULL;
L->a = F->a + S->a;
L->b = F->b;
R->next = L;
R = L;
}
F = F->next;
S = S->next;
}
}
if (F != NULL) {
R->next = F;
}
else {
R->next = S;
}
}
// 多项式乘法运算
void Multiplication(Poly First, Poly Second, Poly& Result) {
Poly* F;
Poly* S;
Poly* R;
Poly Mid[1000];
int i, j;
R = &Result;
F = &First;
S = &Second;
F = F->next;
S = S->next;
for (i = 0; S != NULL; S = S->next, i++) {
Get_Head(Mid[i]);
Poly* L;
L = &Mid[i];
Poly* M = F;
while (M != NULL) {
Poly* P;
P = new Poly;
P->a = M->a * S->a;
P->b = M->b + S->b;
P->next = NULL;
L->next = P;
L = P;
M = M->next;
}
}
if (i == 1) {
R->next = &Mid[0];
}
else {
Poly Mid_R[1000];
Get_Head(Mid_R[0]);
Addition(Mid[0], Mid[1], Mid_R[0]);
int k;
for (j = 2, k = 1; j < i ; j++, k++) {
Get_Head(Mid_R[k]);
Addition(Mid[j], Mid_R[k - 1], Mid_R[k]);
}
Result = Mid_R[k - 1];
}
}
int main() {
Poly First;
Poly Second;
Poly Result1;
Get_Head(Result1);
Poly Result;
Get_Head(Result);
Get_Head(First);
Get_Head(Second);
Get_Elem(First);
Get_Elem(Second);
Multiplication(First, Second, Result);
ShowLnode(Result);
Addition(First, Second, Result1);
ShowLnode(Result1);
return 0;
}
注意事项:
注意解决系数为0的节点。
解决方式一:如果系数为0则不将其存储在链表结构中。
解决方式二:在输出的时候遇到系数为0则不输出。