函数接口定义:
double f( int n, double a[], double x );
其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。
很自然的就会反应出一种愚蠢的解法,是这样的想法:
double f( int n, double a[], double x)
{
int i;
double sum = 0;
for ( i = 0; i <= n; i++ ){
sum += a[ i ] * x的i次方;
}
}
这种解法如此自然,还能得到有效直接,因为C语言函数库中有直接求N次方的函数,直接调用就好了嘛!
但是这种解法会在某些测试点通不过。
改正如下:
double f ( int n, double a[ ], double x )
{
int i;
double num = 1;
double sum = a[ 0 ];
for ( i = 1; i <= n; i++ ){
num = num * x;
sum += num * a[ i ];
}
return sum;
}
对比两种解法可知,后一种解法的乘法少了很多次。其实是用num变量,保留了上一次已经乘过的结果。
如5的9次方,第一种解法会在求过5的8次方后,进入下一轮循环时,还会从头到尾再老老实实乘一遍。。。做人如此老实当然没问题,解题如此就太耗时间了。
第二种解法很明显就用num保留了5的8次方,在求5的9次方时,只需要再进行一次乘法即可。