6-2 多项式求值
本题要求实现一个函数,计算阶数为n
,系数为a[0]
… a[n]
的多项式
f
(
x
)
=
∑
i
=
0
n
(
a
[
i
]
×
x
i
)
f(x)=\sum_{i=0}^{n} (a[i] \times x^i )
f(x)=∑i=0n(a[i]×xi) 在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
答案
#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;
}
double f( int n, double a[], double x )
{
double s = 0.0, x0 = 1.0;
int i;
for (i=0; i<=n; i++)//遍历系数数组
{
if (a[i])//若存在
s += x0 * a[i];//前n项和
x0 *= x;//x的累乘
}
return s;
}
分析
多项式 f ( x ) = ∑ i = 0 n ( a [ i ] × x i ) f(x)=\sum_{i=0}^{n} (a[i] \times x^i ) f(x)=∑i=0n(a[i]×xi)
设n=3
则 f ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 f(x)=a_0+a_1x+a_2x^2+a_3x^3 f(x)=a0+a1x+a2x2+a3x3
从左到右计算,传入的参数是double f( int n, double a[], double x );
n,多项式阶数
a[],系数数组
double x,x的值
当n=0时
f ( x ) = a 0 x 0 = a 0 × 1 = a 0 f(x)=a_0x^0=a_0 \times1=a_0 f(x)=a0x0=a0×1=a0
S 0 = a 0 × x 0 = a 0 S_0=a_0\times x^0=a_0 S0=a0×x0=a0
当n=1时
f ( x ) = a 0 x 0 + a 1 x 1 = a 0 + a 1 x f(x)=a_0x^0+a_1x^1=a_0+a_1x f(x)=a0x0+a1x1=a0+a1x
S 1 = S 0 + a 1 x S_1=S_0+a_1x S1=S0+a1x
当n=2时
f ( x ) = a 0 x 0 + a 1 x 1 + a 2 x 2 = a 0 + a 1 x + a 2 x 2 f(x)=a_0x^0+a_1x^1+a_2x^2=a_0+a_1x+a_2x^2 f(x)=a0x0+a1x1+a2x2=a0+a1x+a2x2
S 2 = S 1 + a 2 x 2 S_2=S_1+a_2x^2 S2=S1+a2x2
当n=3时
f ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 f(x)=a_0+a_1x+a_2x^2+a_3x^3 f(x)=a0+a1x+a2x2+a3x3
S 3 = S 2 + a 3 x 3 S_3=S_2+a_3x^3 S3=S2+a3x3
⋯ \cdots ⋯
当n=i时
f ( x ) = a 0 + a 1 x + ⋯ + a i x i f(x)=a_0+a_1x+\cdots+a_ix^i f(x)=a0+a1x+⋯+aixi
S i = S i − 1 + a i x i S_i=S_{i-1}+a_ix^i Si=Si−1+aixi
于是前n项和: S = S + a [ i ] × x i S=S+a[i]\times x^i S=S+a[i]×xi
x的累乘可以用:
n = 3;//假设传入的阶数n=3
x0 = 1;
x = a;//假设传入的值x=a
for (i=0; i<=n; i++)
{
x0 = x0 * x;
}
于是前n项和可以表示为:
for (i=0; i<=n; i++)//遍历系数数组
{
if (a[i])//若存在
s += x0 * a[i];//前n项和
x0 *= x;//x的累乘
}