多项式求值,是数学中非常常见的一项,给定一个多项式,给定一个未知数,来求值。

那这道题目呢,就是要求实现一个函数,计算阶数为n,系数为a[0]...a[n]的多项式

f(x)=(a[i]*x^i)求和,然后求出在x点的值。

题目也给定了函数接口定义,以及对n、a[]、x的各个说明。

n是多项式的阶数,a[]中存储系数,x是给定点,函数须返回多项式f(x)的值。

c语言求值的顺序(C语言实现多项式求值)(1)

梳理逻辑

看到这么复杂的测试程序样例,我一开始还真有些无从下手,反而浪费了不少时间。

我们先来看一下这道题目给的裁判测试程序样例,可以发现。

这个-43.1是把数组中的每个元素按照多项式的形式进行求和所得到的。

并且最终保留一位小数。

具体实现过程如下图所示:

c语言求值的顺序(C语言实现多项式求值)(2)

那如何来写这个子函数呢。

1、要求数组a的元素很好求,就是写一个for循环遍历即可。

2、x的幂次方怎么写,我们可以调用C语言当中的库函数#include <math.h>,用里面的pow函数求x的幂次方,比方说x的三次方,那就是pow(x,3)。

3、求和的话,就是定义一个变量sum=0,然后sum=sum 多项式,每次存储一个多项式相加。

double f(int n, double a[], double x){ float sum=0; for(int i=0;i<=n;i ){ sum = sum a[i]*pow(x,i); } return sum; }

代码实现

//多项式求值 #include <stdio.h> #include <math.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){ float sum=0; for(int i=0;i<=n;i ){ sum = sum a[i]*pow(x,i); } return sum; }

结果测试

c语言求值的顺序(C语言实现多项式求值)(3)

c语言求值的顺序(C语言实现多项式求值)(4)

总结

总的来说,这类函数题难度并不大,但关键是读懂题目,像我最开始做这道题的时候,就有些没看懂这道题目在讲些什么,主要是对数学式子多项式不是很清楚,但后来按照它给的测试样例代入进行测试后,然后反推逻辑,就知道了整个程序的要求,再来完成这道题目也就快了许多。

,