可以用数组存储多项式。数组的下标是每项的指数,数组的值是每项的系数:
那么 P 和 Q 就是有序表,P + Q 就是有序数组的合并操作,只要对应项求和即可。
若 n ≤ m,则将 0 至 n 项系数相加,n+1到m直接复制即可,反之亦然。
-----------------------分-----------------------割-----------------------线-----------------------
如果 P 是一个稀疏多项式,又该如何处理呢
如果仍然采用顺序方式存储,显然会造成大量的空间浪费,
为提高存储空间利用率,可采用压缩存储方式,也就是只存储那些有效项。
数组a 只存储了多项式 p 中的三项,且按照指数从低到高依次存储。
比如说这道题:
就是两个有序表的合并问题
核心代码:
// 初始设定,i为数组P的下标,j为数组Q的下标,k为数组C的下标 // 数组P和数组Q自然对应上面截图,数组C则是用于存放二者 int i = j = k = 0; // 设定 while 循环的结束条件: // 即 i 不超过存储多项式P的数组下标。 // 即 j 不超过存储多项式Q的数组下标。 while(i<N && j<M){ // 如果数组P下标为 i 的元素的exp项, // 也就是指数小于数组Q下标为 j 的元素,就让其赋值给数组C // 这是通过使两个递增的数组,重组为一个继续递增的数组 if(P[i].exp < Q[j].exp){ C[k++] = P[i]; i++; }else if(P[i].exp > Q[j].exp){ // 同上 C[k++] = Q[j]; j++; }else{ // 如果指数相等(这点并未直接体现,而是上述两种情况之外的情况, // 不是大于小于,那肯定是等于),且常数项相加不为0 // 就让两者常数项相加 // 再让把两者中任意一个(毕竟指数相同)的指数存进数组C的指数项 if((P[i].ceof + Q[j].ceof) != 0){ C[k++].ceof = val; C[K++].exp = P[i].exp; } i++; j++; } }
最后将 P 或 Q 剩余段加入新表中