演算法導論 多項式求和

2021-06-26 14:02:42 字數 1761 閱讀 4271

一般情況下,一元n次多項式可寫成:

其中,p

i是指數為e

i的項的非零係數,且滿足

因此,我們可以採用線性表(定義:線性表是由n個資料元素構成的有限序列,比如陣列、向量、鍊錶等等)來表示:

其中,每一項的指數i可以用其係數pi的序號表示。

在通常的應用中,多項式的次數比較大,使得線性表的長度很難確定,因此我們可以考慮鍊錶,向量也可以(c++中)。舉例說明:假如我們用陣列來表示下面的多項式:

可見,我們需要乙個大小為1549的陣列來表示,而實際有用的資訊只有陣列中的4個元素,其他地方都是0,所以造成了空間浪費。並且如果我們事先不知道多項式的最高次項的指數,則我們需要定義乙個足夠大的陣列來儲存,這樣做顯然浪費了很多記憶體空間。我們可以使用鍊錶來解決上述問題:

在計算機內,我們用乙個結點來存放多項式的一項,為了節約空間,並和書寫習慣一致,只需保留非零係數的項。每個結點分係數、指數和指標三個域,如下圖所示,其中的指標next指明下一項的位置。

例如,下面多項式分別為a,b:

用迴圈鍊錶可以表示如下:

兩個多項式相加的運算規則很簡單,對所有指數相同的項,將其對應係數相加,若和不為零,則構成和多項式中的一項;將所有指數不相同的項複製到和多項式中。

具體實現時,我們以上面的多項式a,b為測試樣例。可採用另建煉表來儲存和的多項式的方法,或採用把乙個多項式歸併入另乙個多項式的方法。我們以後種方法為例,即將a+b的和多項式儲存到a中。具體程式實現如下(我採用了迴圈鍊錶):

#include#include#includetypedef struct pnode//用鍊錶來儲存多項式資訊

polynode;

polynode *create()

else

break;

} r->next=head;//構造迴圈鍊錶

return head;

}polynode*polyadd(polynode* pa,polynode* pb)//進行多項式相加

else if(p->exp>q->exp)//p的指數大於q的指數,將q放入鍊錶中

else//當兩者指數相同時,進行合併

else//若合併結果為0,將該節點移除

p=s->next;

r=q;

q=q->next;

free(r);

} }if(q!=pb)//如果多項式b的項數少於多項式a的情況

return pa;

}void output(polynode *head)// 輸出多項式資訊

printf("\n");

}void main()

執行結果如下:

原文:

多項式求和

多項式的描述如下 1 1 2 1 3 1 4 1 5 1 6 現在請你求出該多項式的前n項的和。輸入資料由2行組成,首先是乙個正整數m m 100 表示測試例項的個數,第二行包含m個正整數,對於每乙個整數 不妨設為n,n 1000 求該多項式的前n項的和。對於每個測試例項n,要求輸出多項式前n項的和...

多項式求和

time limit 1000ms memory limit 65536k 有疑問?點這裡 多項式描述如下 1 1 2 1 3 1 4 1 5 1 6 先請你求出多項式前n項的和。第一行輸入乙個數t代表測試資料個數 t 1000 接下來t行每行1個數代表n 0 n 2 31 對於每個輸入樣例,輸出多...

多項式求和

問題描述 用單鏈表儲存一元多項式,並實現兩個多項式的加法。輸入描述 若干資料。程式輸出 多項式a,多項式b,有序多項式a,b,相加後的多項式。include include define max 20 多項式最多項數 typedef struct 定義存放多項式的陣列型別 polyarray typ...