多项式求值算法,如果仅用普通的多项式的求法,对于n次多项式,需要n/(n+1)次的乘法,n次加法,计算量大,改用秦九韶算法,能有效的降低时间复杂度,并且该算法还能顺便给出多项式在该点的导数值,一举多得。秦九韶算法在国外又称Hernor算法。
下面贴代码:
/*
*多项式求值的秦九韶算符(国外称Hernor算法)
*该算符将一个多项式求值,原本进行n(n+1)/2次乘法,和n次加法运算
*简化成n次乘法运算和n次加法运算。
*并能给出该点的导数值
*接口说明:返回值是double类型。
*double* a :输入的多项式的系数数组,序列为最高阶项到常数项。既a[0]代表n次项的系数
*double x:待求值
*const int n:多项式的阶数,n阶多项式为n。
*/
#include<iostream>
double Hernor(double* a,double x,const int n)
{
double* b = new double[n + 1];
b[0] = a[0];
int i = 1;
while (i <= n)
{
b[i] = b[i - 1] * x + a[i];
i++;
}
double y = b[n];
delete[] b;
return y;
}
double Hernor_D(double* a, double x, const int n)
{
double* b = new double[n + 1];
b[0] = a[0];
int i = 1;
while (i <= n)
{
b[i] = b[i - 1] * x + a[i];
i++;
}
double* c = new double[n];
i = 1;
while (i < n)
{
c[0] = b[0];
c[i] = c[i - 1] * x + b[i];
i++;
}
double y = c[n - 1];
delete[] b;
delete[] c;
return y;
}
/*
int main()
{
double a[6] = { 3.0,0,-2.0,0,1.0,7.0 };
int x = 3;
double value;
value = Hernor(a, x, 5);
std::cout << "该多项式在x=-2处的值为 " << value <<std::endl;
value = Hernor_D(a, x, 5);
std::cout << "该多项式在x=-2处的导数值为 " << value << std::endl;
return 0;
}
*/