本题要求实现一个函数,计算阶数为n
,系数为a[0]
... a[n]
的多项式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
对于此题我错了很多遍,但是依旧没有通过,只好网上查了一下,但是复制了别人的代码后发现竟然可以通过(懵逼中):
经过不懂此题不罢休的精神,我决定收录到我的csdn中,以作警戒,提示自己(严肃脸)。
正解:
double f(int n,double a[],double x)
{
double temp =1;
double count=a[0]; //重点 1 -- 默认初始为a[0]可以省很多麻烦
for(int i=1;i<=n;i++)//重点 2 -- 对于i=1 因为count直接赋值为a[0]。
{
temp*=x; //重点 4 -- 对于指数的求解精华所在
count+= a[i]*temp; //重点 3 -- 对于此为何直接用,要联系重点1
}
return count;
}
误解:
double f(int n,double a[],double x)
{
double N[n];
double count = 0.0;
for(int i=0;i<n;i++)
{
if(i == 0)
N[i]=1;
else
N[i]=N[i-1]*x
}
for(int j=0;j<n;j++)
{
count+=a[i]*N[i];
}
return count;
}
误解中:
1.对于指数的求解我在询问别人之后别人提出 所谓的 --动态规划--(用空间换时间)我写出了第一个for循环,
2.对于下面的for循环用作累加使用---然后提交全部都是错误。(难后啊)
总结:
对于正解和我自己low的方法对比,知道自己以下几点,同时希望能给读者一些启发
1.在拿到这个题目的时候,先把式子在纸上展开一下,(个人感觉看到这个式子还是拿笔推演了一个才知道其中的特点)
2.对于一些表面的循环能否进行优化简写—— 对于指数的求解我一开始就用最笨的方法求解,但正解中其实是很简单。
3.换种思考(这么说很飘渺)白话文就是:不断的尝试,例如这题,提交错误(超时etc。。),就不要在原基础上修改了,停下来把那些特殊的位置单独取出来进行分析。这题就是把a[0],和系数抽离,用总和(count)直接赋值a[0].