在《演算法設計技巧與分析》5.5節介紹了多項式求值的巢狀乘法,也稱作horner規則,即pn(x)=anxn+an-1xn-1+...+a1x+a0=((...(((anx+an-1)x+an-2)x+an-3)...)x+a1)x+a0。這個是很容易就實現的。這裡要求次數是連續的並且大於等於0。
如果定義多項式的資料結構poly.h如下,
1 #ifndef poly_h_2#define poly_h_
34 #include
5 #include
6 #include
7using
namespace std;89
class poly
10 16 poly(const poly& a)
17
21void outputpoly()
22
33 };
3435
#endif
並且實現了多項式加法和乘法,如下
1 #include "poly.h"2
3void polyadd(poly& c,poly& a,poly& b);
4void polymul(poly& c,poly& a,poly& b);56
int main()
7 ;10 a.powr=;
11 poly b;
12 b.coef=;
13 b.powr=;
14 poly c;
15 polyadd(c,a,b);
16 poly d;
17 polymul(d,a,b);
18 cout << "a:"
<< endl;
19 a.outputpoly();
20 cout << "b:"
<< endl;
21 b.outputpoly();
22 cout << "
c=a+b:
"<< endl;
23 c.outputpoly();
24 cout << "
d=a*b:
"<< endl;
25 d.outputpoly();
26return
0;27 }
2829
void polyadd(poly& a, poly& b)
30 35
36void polyadd(poly& c,poly& a,poly& b)
37 46
47 c.coef.clear();
48 c.powr.clear();
4950
//poly c;
51for(i=0,j=0;i52
60else
if(a.powr[i]61
66else
67
72 }
73if(i==m && j74
80 }
81else
if(i82
88 }
89//
return c;
90 }
9192
void polymul(poly& c,poly& a,poly& b)
93 108 }
109110
for(i=0;i111
114 }
那麼該怎麼來實現多項式求值呢?
比較直接的是將它擴充套件成次數連續且是大於等於0的多項式,然後求值,可以直接使用巢狀乘法嗎?
下面的鏈結中,對巢狀乘法和直接計算求多項式的值進行比較,結果很有意思,可以關注下。
資料結構與演算法 多項式ADT
陣列實現宣告 typedef struct polynomial 初始化為0 void zeropolynomial polynomial poly 相加 void addpolynomial const polynomial poly1,const polynomial poly2,polynom...
資料結構之多項式(C )
資料結構多項式,運用到類的複製建構函式,靜態成員等基礎知識,簡單實現了加法和乘法運算,但是對乘法 複雜度比較高 暫時做這樣處理。對於多項式的構成這些不做多餘介紹。本 純手工製作,難免有不足之處。標頭檔案 polynomial h ifndef polynomial h define polynomi...
資料結構實驗,多項式類
多項式類標頭檔案 2013.5.24 該檔案定義乙個polynomial 多項式 類 類中使用帶頭節點的鏈式佇列儲存多項式資訊 每個節點的c表示多項式每一項的係數 頭結點的c表示項數 e表示每一項的指數 輸入資料格式以下為例 3.1x8 11x9 2x 7 9x 9x 3x 6x 3 x 4.4x2...