02-线性结构2 一元多项式的乘法与加法运算 (20 分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
===================================================================
看了别人代码不太满意,我决定动手写一个。这是数组版的,当然链表也能实现,过几天更新之后,我会把链接放在(这里)。
首先,为什么用数组?
数组缺点:浪费空间,数组把零项也存了。如果指数过大,则放不下。
比如多项式就两项: 第一项 指数10000, 系数 2,第二项指数1系数1,这时需要开一个10001大小的数组,中间全是零项,浪费!如果指数10000000000,数组开不了这么大的,就需要链表了~
数组优点:数组非常简单,数组下标是指数,数组值是系数。本题数据规模很小,因为指数不超过1000,所以数组大小为1001就行了,没有任何压力。
链表优点是灵活,只存非零项,节省空间,缺点是操作略微麻烦。
多项式相加:指数相同时,系数相加。
多项式相乘:一个多项式的每一项,去乘另外的多项式所有项,然后相加。
8说啦,直接看代码:
===================================================================
#include<iostream>
using namespace std;
int main() {
int n1, n2, c, e;
cin >> n1;
int ans[2001] = { 0 }, A[1001] = { 0 }, B[1001] = { 0 };
for (int i = 0; i < n1; i++) {
cin >> c >> e;
A[e] = c;
B[e] = c; //A数组存第一个多项式,B数组存两多项式和
}
cin >> n2;
for (int i = 0; i < n2; i++) {
cin >> c >> e;
B[e] += c; //多项式相加
for (int j = 0; j < 1001; j++)
ans[j + e] += c * A[j]; //多项式相乘。(指数相加,系数相乘)
}
int first = 1, hasPoly = 0; //first标记第一个输出,hasPoly标记零多项式
for (int i = 2001; i >= 0; i--) {
if (ans[i] != 0) {
if(!first) printf(" "); //第一项前面没有空格
first = 0;
printf("%d %d", ans[i], i);
hasPoly = 1; //有非零项,置为1
}
}
if (hasPoly == 0) printf("0 0"); //如果没有非零项,直接输出0 0
first = 1;
hasPoly = 0;
printf("\n");
for (int i = 1001; i >= 0; i--) {
if (B[i] != 0) {
if (!first) printf(" ");
first = 0;
printf("%d %d", B[i], i);
hasPoly = 1;
}
}
if (hasPoly == 0) printf("0 0");
return 0;
}