顺序表-多项式求和


 

 

可以用数组存储多项式。数组的下标是每项的指数,数组的值是每项的系数:

那么 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 剩余段加入新表中


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM