题目描述:
本题要求实现一个函数,计算阶数为n
,系数为a[0]
... a[n]
的多项式f(x)= (a[i]×
)在
x
点的值。
函数接口定义:
double f( int n, double a[], double x );
其中n
是多项式的阶数,a[]
中存储系数,x
是给定点。函数须返回多项式f(x)
的值。
以下是已经给出的代码:
#include <stdio.h>
#define MAXN 10
double f( int n, double a[], double x );
int main()
{
int n, i;
double a[MAXN], x;
scanf("%d %lf", &n, &x);
for ( i=0; i<=n; i++ )
scanf("%lf", &a[i]);
printf("%.1f\n", f(n, a, x));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 1.1
1 2.5 -38.7
输出样例:
-43.1
审题分析:
(本题作者用C++来实现,用vs来运行;
通过题目已经给出的代码可以得知n,x,a[n]是已经确定的值,即我们要输入的量;
最后打印的结果是函数的返回值,所以要将求和结果设为函数的返回值;(重新定义一个double类型的变量,作为求和结果——sum)
函数要实现的内容是f(x)= (a[i]×
),由于既要求和又要计算x的i次幂,所以要用两个循环,作为循环嵌套;
p1.在内部循环中,将 b
初始化为 1.0,然后按需要进行幂运算,而不是在每次迭代开始时都初始化为 1.0
p2.外部循环通过 for (int i = 0; i <= n; i++)
遍历多项式的每一项。在每次迭代中,i
表示当前项的次数
p3.在内部循环 for (int j = 0; j < i; j++)
中,b 被计算为 x
的 i
次幂。这是通过将 x
乘以自身 j
次实现的。这是手动实现 x
的幂运算的一种方式。
以下是代码:
double f(int n, double a[], double x)
{
double sum = 0.0;
for (int i = 0; i <= n; i++) {//外部循环
int b = 1.0;
for (int j = 0; j < i; j++) {//内部循环
b = b * x;
}
sum = sum + a[i] * b;
}
return sum;
}
但是,这样的代码可能会在n输入过大时超时,且不是最为简单简洁好用的算幂代码,一般使用秦九韶算法(Horner's method);
秦九韶算法是一种用于快速计算多项式值的方法,避免了手动计算幂的重复工作。它通过将多项式拆分为简单的项,以更有效地计算。
以下是修进后的代码:
double f(int n, double a[], double x) {
double sum = a[n];
for (int i = n - 1; i >= 0; i--) {
sum = sum * x + a[i];
}
return sum;
}
p1.初始化sum变量为多项式的最高次数对应的系数 a[n];(秦九韶算法的标志
在代码中,这个过程体现为从最高次幂开始,不断地用当前结果乘以 ( x ) 并加上下一个系数,直到遍历完所有系数。这样一来,我们只需要进行一次幂运算,而不是每次都进行,从而提高了效率。
秦九韶算法是一种优化的多项式求值方法,特别适用于大型多项式或需要在多个点上进行多项式求值的情况。