可以用數組存儲多項式。數組的下標是每項的指數,數組的值是每項的系數:
那么 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 剩余段加入新表中