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
题目链接
思路
首先需要明确这个问题的几个难点:
指数的处理:
- 在计算多项式的和时,需要处理不同指数的项。如果两个多项式中存在相同指数的项,那么直接相加或相减即可。但如果指数不同,则需要单独处理这些项,因为它们在多项式中是独立的。
- 在计算多项式的积时,需要将第一个多项式的每一项与第二个多项式的每一项相乘,这会导致指数的累加。因此,必须正确地处理和更新指数。
- 以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。
避免重复项:
- 在计算多项式的积时,可能会出现重复的项,特别是在指数相加时。需要有一种机制来检测并合并这些重复的项,以得到一个简化后的多项式。
处理高阶项:
- 多项式的阶数可能很高,这意味着需要处理大量的项。在计算过程中,需要确保数组足够大,能够存储所有可能的项。
优化性能:
- 对于大型多项式,计算和存储操作可能会变得非常耗时。因此,优化算法的性能,例如通过空间换时间的策略,可以提高程序的效率。
边界条件的处理:
- 需要考虑多项式中可能存在的边界情况,例如所有系数为零的项。这些特殊情况需要在算法中得到妥善处理。
1. 数据结构的选择:
本题为线性表的运用,对于多项式的存储,我们有两种选择,一种是使用结构体数组,另一种是使用链表,结合本题的要求来考虑,不管运用那种线性表,都要面临数据的输入和输出以及最核心的求解多项式和与多项式积两方面的问题,使用链表不仅需要频繁地面临内存的申请与释放问题,很可能造成内存泄漏问题,而且会使代码更加复杂,特别是在处理多项式的和与积时,需要考虑链表的连接和断开逻辑,以及在链表中查找和合并重复项的逻辑。故据此我们在本题使用结构体数组。使用结构体来定义多项式的每一项,包括系数和指数。如下:
// 定义结构体Term,用于存储多项式中的项
typedef struct Term {
int factor; // 系数
int index; // 指数
} Term;
2. 数据的输入:
由于我们需要两个结构体数组来存储两个多项式,为了避免重复相同的逻辑,我们可以使用函数在堆上创建并读入。代码如下:
// 创建多项式数组的函数
Term *createPolynomialArray(int size) {
// 防止传入一个系数全为零的多项式
if (size == 0) {
return NULL; // 如果传入大小为0,返回NULL
}
Term *poly = (Term *)malloc(sizeof(Term) * size); // 动态分配内存
// 读取输入的多项式项,并存储到数组中
for (int i = 0; i < size; i++) {
scanf("%d %d", &poly[i].factor, &poly[i].index);
}
return poly;
}
3. 多项式求和:
定义一个 pool 数组,其含义是存储以指数为下标的项的系数,最开始初始化全部元素为 0,大小为 MAXSIZE(1001),题目中说明了指数不会超过 1000。依次遍历两个结构体数组,最终记录下和多项式的指数以及对应的系数,按要求输出即可。代码如下:
// 计算多项式和的函数
void sumOfPolynomials(Term *poly1, int size1, Term *poly2, int size2) {
// 初始化数组来存储和的项
int pool[MAXSIZE] = {
0};
for (int i = 0; i < size1; i++) {
int idx = poly1[i].index;
pool[idx] = poly1[i].factor;
}
for (int i = 0; i < size2; i++) {
int idx = poly2[i].index;
pool[idx] += poly2[i].factor;
}
// 构建和多项式的数组
Term poly[size1 + size2];
// 从大到小遍历pool数组,构建多项式项
for (int i = MAXSIZE - 1; i >= 0; i--) {
if (pool[i]) {
poly[idx].index = i;
poly[idx].factor = pool[i];
idx++;
}
}