一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出“0 0”。

输入样例

1
2
4 3 4 -5 2  6 1  -2 0
3 5 20 -7 4 3 1

输出样例

1
2
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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include<stdio.h>
typedef struct NUM * List;
struct NUM {
int coef;//系数
int expo;//指数
List next;
};
void addNode(int coef, int expo, List *rear);
List add(List quem, List quen);
List mul(List quem, List quen);
List insertSortandMerge(List front);
void Print(List res);
int main()
{
int m, n,coef,expo;
List quem, quen, resadd, resmul;
List rearm = (List)malloc(sizeof(struct NUM)), rearn = (List)malloc(sizeof(struct NUM));
rearm->next = NULL;
rearn->next = NULL;
quem = rearm;
quen = rearn;
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
scanf("%d %d", &coef, &expo);
addNode(coef, expo, &rearm);
}
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d", &coef, &expo);
addNode(coef, expo, &rearn);
}
resadd = add(quem->next, quen->next);
resmul = mul(quem->next, quen->next);
Print(resmul);
printf("\n");
Print(resadd);
return 0;
}
void addNode(int coef, int expo, List *rear)
{
//由于在本函数中需要改变当前结果表达式尾项指针的值
//所以函数传递进来的是尾项结点指针的地址,*rear指向尾项
List P = (List)malloc(sizeof(struct NUM));//申请新节点并赋值
P->coef = coef;
P->expo = expo;
P->next = NULL;
//将P指向的新节点插入到当前结果表达式尾项的后面
(*rear)->next = P;
*rear = (*rear)->next;//修改rear值
}
List add(List quem, List quen)
{
List front, rear, temp;//为方便表头插入,先产生一个临时空结点作为结果多项式链表头
rear = (List)malloc(sizeof(struct NUM));
front = rear;//由front记录结果多项式链表头结点
int sum;
while (quem&&quen)//当两个多项式都有非零项待处理时
{
if (quem->expo == quen->expo)//两数据项指数相等
{
sum = quem->coef + quen->coef;
if (sum)
addNode(sum, quem->expo, &rear);
quem = quem->next;
quen = quen->next;
continue;
}
if (quem->expo < quen->expo)//quen中的数据项指数较大
{
addNode(quen->coef, quen->expo, &rear);
quen = quen->next;
continue;
}
if (quem->expo > quen->expo)//quem中的数据项指数较大
{
addNode(quem->coef, quem->expo, &rear);
quem = quem->next;
continue;
}
}
//将未处理完的另一个多项式的所有结点依次复制到结果多项式中去
while (quem)
{
addNode(quem->coef, quem->expo, &rear);
quem = quem->next;
}
while (quen)
{
addNode(quen->coef, quen->expo, &rear);
quen = quen->next;
}
rear->next = NULL;
temp = front;
front = front->next;//令front指向结果多项式第一个非零项
free(temp);//释放临时空表头结点
return front;
}
List mul(List quem, List quen)
{
List front, rear, temp, Fquem;//Fquem保存quem的位置
int sum, mul;
rear = (List)malloc(sizeof(struct NUM));
front = rear;
Fquem = quem;
while (quen)
{
while (quem)
{
sum = (quem->coef) * (quen->coef);
mul = (quem->expo) + (quen->expo);
addNode(sum, mul, &rear);
quem = quem->next;
}
quem = Fquem;//重置quem
quen = quen->next;
}
rear->next = NULL;
temp = front;
front = front->next;
free(temp);
front = insertSortandMerge(front);

return front;
}
List insertSortandMerge(List front)
{
//处理多项式乘法的结果
/*按指数从大到小进行插入排序,第二个循环中顺便将要插入的项与之前排好序的“队列”中指数相同的项进行合并*/
List head, temp, front_to_free = front;
int sum;
head = (List)malloc(sizeof(struct NUM));
head->next = NULL;
if (front == NULL)
return NULL;
else
{
head->coef = front->coef;
head->expo = front->expo;
front = front->next;
}
while (front)
{
temp = head;
while (temp->next)
{

if (front->expo == temp->next->expo)
{
sum = temp->next->coef + front->coef;
if (sum)
{
temp->next->coef = sum;
}
else
{
temp->next = temp->next->next;
}
front = front->next;
break;
}
if (front->expo > head->expo)
{
List t = (List)malloc(sizeof(struct NUM));
t->coef = front->coef;
t->expo = front->expo;
t->next = head;
head = t;
front = front->next;
free(t);
break;
}
if (front->expo < temp->expo && front->expo>temp->next->expo)
{
List t = (List)malloc(sizeof(struct NUM));
t->coef = front->coef;
t->expo = front->expo;
t->next = temp->next;
temp->next = t;
front = front->next;
free(t);
break;
}
temp = temp->next;
}
if (temp->next == NULL)
{
addNode(front->coef, front->expo, &temp);
front = front->next;
}
}
free(front_to_free);
return head;
}
void Print(List res)
{
//输出操作,首先特判一下
if (res == NULL)
printf("0 0");
else while (res)
{
printf("%d %d", res->coef, res->expo);
if (res->next)
printf(" ");
res = res->next;
}
}

测试点信息

1
2
3
4
5
测试点    提示
0 sample换个数字
1 同类项合并时有抵消
2 系数和指数取上限,结果有零多项式
3 输入有零多项式和常数多项式

什么都不想说,因为写了六个小时,太累了。

好吧,时隔一个星期,我又回来补上了一部分注释。