一般情況下,一元n次多項式可寫成:
其中,pi是指數為ei的項的非零係數,且滿足
因此,我們可以採用線性表(定義:線性表是由n個資料元素構成的有限序列,比如陣列、向量、鍊錶等等)來表示:
其中,每一項的指數i可以用其係數pi的序號表示。
在通常的應用中,多項式的次數比較大,使得線性表的長度很難確定,因此我們可以考慮鍊錶,向量也可以(c++中)。舉例說明:假如我們用陣列來表示下面的多項式:
可見,我們需要乙個大小為1549的陣列來表示,而實際有用的資訊只有陣列中的4個元素,其他地方都是0,所以造成了空間浪費。並且如果我們事先不知道多項式的最高次項的指數,則我們需要定義乙個足夠大的陣列來儲存,這樣做顯然浪費了很多記憶體空間。我們可以使用鍊錶來解決上述問題:
在計算機內,我們用乙個結點來存放多項式的一項,為了節約空間,並和書寫習慣一致,只需保留非零係數的項。每個結點分係數、指數和指標三個域,如下圖所示,其中的指標next指明下一項的位置。
例如,下面多項式分別為a,b:
用迴圈鍊錶可以表示如下:
兩個多項式相加的運算規則很簡單,對所有指數相同的項,將其對應係數相加,若和不為零,則構成和多項式中的一項;將所有指數不相同的項複製到和多項式中。具體實現時,我們以上面的多項式a,b為測試樣例。可採用另建煉表來儲存和的多項式的方法,或採用把乙個多項式歸併入另乙個多項式的方法。我們以後種方法為例,即將a+b的和多項式儲存到a中。具體程式實現如下(我採用了迴圈鍊錶):
[cpp]view plain
copy
#include
#include
#include
typedef
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...