题目
本题要求实现一个函数,计算阶数为
n
,系数为
a[0]
…
a[n]
的多项式(上图) 在
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 sum=a[0];
double temp=1.0;
int i;
for(i=1;i<=n;i++){
temp *= x;
sum += temp*a[i];
}
return sum;
}
求解本题的基本思路:
上述多项式为了观察方便,我们可以写作:
1.主函数
在主函数中我们已经得到了输入的n、x,即上述多项式中a[i]为a[n]。
首先要得到要在开始计算之前让计算机得到a[n] (用户虽然输入了n,但是计算机并不会使用。),所以要采用循环的方式得到最大a[n]为a[2]。每次得到具体的a[i]时都要为其赋值才能进行后续计算(循环体)。
打印时我们可以看到所求函数有三个参数n、a[]、x,很明显这是后续计算中需要用到的值。
2.计算函数
double f( int n, double a[], double x );
很明显,这就是我们需要解决的函数。
从这一行中,我们可以得到的内容除了三个参数以外,还有一个返回值类型(double)。
注:函数返回值类型即函数开头的数据类型(非常好找)。如果是以void开头则表示没有返回值,不需要在函数结束时写return,否则必须写一个返回值。
现在可以开始分析应该怎么表示多项式的和了。其实我们很容易就可以总结出,在一个式子中如果一个运算符号多次出现就一定会使用到循环。
首先,我们拆解多项式把它分成很小的计算机能够理解的部分。比如:
我们可以发现这就是多个
的和组成的,我们把和这个变量命名为sum。继续拆解,可以拆成a[i]和
a[i]我们已经在主函数赋值。
则是由多个x相乘得到的,我们把乘积这个变量命名为temp。
3.整合
在主函数中,对于i=0,n=2,x=1.1(因为多项式是由a[0]加到a[n])来说现在已经得到了,a[0]=2、a[1]=1、a[2]=-38.7。(数据都是输入样例中的。)
在计算函数中,我们只要得到最终的sum即最后多项式的和再返回就可以了。
最终
(这里学过赋值就很好理解了),往前推就能很轻易得到sum的初值应该为a[0],也能判断出循环中的i初值为1。
temp初值一定为1。
最后 ,
。
所以计算函数应为:
double f(int n,double a[],double x){
double sum=a[0];
double temp=1.0;
int i;
for(i=1;i<=n;i++){
temp *= x;
sum += temp*a[i];
}
return sum;
}