多項式求值

2021-06-16 23:55:06 字數 4719 閱讀 1193

例2-8   [多項式求值] 考察多項式p (x)= 

n                 

σ cix^i

i=0

如果cn≠0,則p 是乙個n 維多項式。下面程式可用來計算對於給定的值x,p(x)的實際取值。假定根據f o r迴圈內部所執行的加和乘的次數來估算時間複雜性。可以使用維數n 作為例項特徵。進入f o r迴圈的總次數為n,每次迴圈執行1次加法和2次乘法(這種操作計數不包含迴圈控制變數i 每次遞增所執行的加法) 。加法的次數為n,乘法的次數為2n。

程式2-3:

template t polyeval(t coeff, int n, const t& x)

return value;

}

horner 法則採用如下的分解式計算乙個多項式:p (x) = (…(c

n* x +cn -1 ) * x +cn -2 ) * x +cn -3 ) * x + …) * x + c0

相應的c + +函式見程式2 - 4。採用與程式2 - 3相同的方法,可以估算出該程式的時間複雜性為n 次加法和n 次乘法由於函式polyeval 所執行的加法數與horner 相同,而乘法數是h o r n e r的兩倍,因此,函式horner 應該更快。

程式2-4:

templatet horner( t coeff, int n, const t& x)

return value;

}

int chessdatacheck( chessdata& cdata,int chess,int posx,int posy )

//棋子的正確性

if (checksafe(cdata,chess,posx,posy) == -1)

//可以下棋

cdata.data[posx][posy] = chess;

//黑棋要判斷禁手

if ( cm_black == chess && -1 == forbid(cdata,posx,posy))

nresult = isover(cdata,chess,posx,posy);

printchessdata(cdata);

return nresult;

}

//判斷是否是長連

//返回1 沒有構成禁手;返回-1 表示構成禁手

int forbidline( chessdata& cdata,int posx,int posy )

int i = 0;

for( i = 0; i < 6; i ++)

if (cdata.data[posxx][posy] == cm_black && cdata.data[posxx+1][posy] == cm_black && cdata.data[posxx+2][posy] == cm_black

&& cdata.data[posxx+3][posy] == cm_black && cdata.data[posxx+4][posy] == cm_black && cdata.data[posxx+5][posy] == cm_black)

}//橫向判斷

int posyy = posy - 5;

if ( posyy <0)

for( i = 0; i < 6; i ++)

if (cdata.data[posx][posyy] == cm_black && cdata.data[posx][posyy+1] == cm_black && cdata.data[posx][posyy+2] == cm_black

&& cdata.data[posx][posyy+3] == cm_black && cdata.data[posx][posyy+4] == cm_black && cdata.data[posx][posyy+5] == cm_black)

}//右下判斷

if ( posx > posy) }

else }

for( i = 0; i < 6; i ++)

if (cdata.data[posxx][posyy] == cm_black && cdata.data[posxx+1][posyy+1] == cm_black&& cdata.data[posxx+2][posyy+2] == cm_black

&& cdata.data[posxx+3][posyy+3] == cm_black&& cdata.data[posxx+4][posyy+4] == cm_black && cdata.data[posxx+5][posyy+5] == cm_black)

}//左下判斷

if ( (posx+posy) >14 )

else

}else

else

}for( i = 0; i < 6; i ++)

if (cdata.data[posxx][posyy] == cm_black && cdata.data[posxx+1][posyy-1] == cm_black&& cdata.data[posxx+2][posyy-2] == cm_black

&& cdata.data[posxx+3][posyy-3] == cm_black&& cdata.data[posxx+4][posyy-4] == cm_black && cdata.data[posxx+5][posyy+5] == cm_black)

}return 1;

}

//判斷黑棋禁手

//返回1 沒有禁手; 返回-1 表示黑棋禁手失敗了

int forbid(chessdata& cdata,int posx,int posy)

//判斷是否結束,不考慮禁手的情況

//返回chess 勝利;0 都沒勝利

int isover(chessdata& cdata,int chess,int posx,int posy)

int i = 0;

for( i = 0; i < 5; i ++)

if (cdata.data[posxx][posy] == chess && cdata.data[posxx+1][posy] == chess && cdata.data[posxx+2][posy] == chess

&& cdata.data[posxx+3][posy] == chess && cdata.data[posxx+4][posy] == chess)

}//橫向判斷

int posyy = posy - 4;

if ( posyy <0)

for( i = 0; i < 5; i ++)

if (cdata.data[posx][posyy] == chess && cdata.data[posx][posyy+1] == chess && cdata.data[posx][posyy+2] == chess

&& cdata.data[posx][posyy+3] == chess && cdata.data[posx][posyy+4] == chess)

}//右下判斷

if ( posx > posy) }

else }

for( i = 0; i < 5; i ++)

if (cdata.data[posxx][posyy] == chess && cdata.data[posxx+1][posyy+1] == chess&& cdata.data[posxx+2][posyy+2] == chess

&& cdata.data[posxx+3][posyy+3] == chess&& cdata.data[posxx+4][posyy+4] == chess)

}//左下判斷

if ( (posx+posy) >14 )

else

}else

else

}for( i = 0; i < 5; i ++)

if (cdata.data[posxx][posyy] == chess && cdata.data[posxx+1][posyy-1] == chess&& cdata.data[posxx+2][posyy-2] == chess

&& cdata.data[posxx+3][posyy-3] == chess&& cdata.data[posxx+4][posyy-4] == chess)

}return 0;

}

//檢查棋子下的正確性,比如下了兩次白棋

int checksafe(chessdata& cdata,int chess,int posx,int posy)

//必須黑棋先下,並且偶數次為黑棋,奇數為白棋

static int ntype = -1;

ntype ++;

//本該下黑棋結果下了白棋

if ( ntype%2 ==0 && chess != cm_black)

//本該下白棋結果下了黑棋

if ( ntype%2 ==1 && chess == cm_black)

//判斷該位置是否有棋子

if (cdata.data[posx][posy] == cm_black || cdata.data[posx][posy] == cm_white )

return 0;

}

多項式求值

題目描述 學了數論後,小傑最近對整係數多項式在整點的取值感興趣,他現在來求助你幫他計算。乙個整係數多項式通常表示為f x a0 a1x a2x2 a3x3 anxn,其中ai i 0,1,2,n 為整數。給定x z,求出f x mod1000000007。輸入描述 多組讀入。每組的第一行,表示多項式...

多項式求值

輸入的第一行為乙個整數 m m 1 leq m 181 m 18 表示多項式共有 m m 項。之後輸入 m m 行,每行有兩個元素,分別表示多項式各項的係數 c c 與次數 e e 1 leq c i 1001 ci 10 0,1 leq n 251 n 25 最後一行為待求多項式的變數值 x 0x...

4 2 多項式求值

本題要求實現乙個函式,計算階數為n,係數為a 0 a n 的多項式 函式介面定義 double f int n,double a,double x 其中n是多項式的階數,a中儲存係數,x是給定點。函式須返回多項式f x 的值。裁判測試程式樣例 include define maxn 10 doubl...