本题要求实现一个函数,计算阶数为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
#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
#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;
}
/* 你的代码将被嵌在这里 */
long double fun(int n,double x);
double f( int n, double a[], double x ){
double sum=0;
for(int i=0;i<=n;i++)
{
sum+=a[i]*fun(i,x);//相当于这里有一个双重循环,会超时
}
return sum;
}
long double fun(int n,double x)
{
long double s=1;
for(int i=0;i
{
s*=x;
}
return s;
}
超时原因:里面有重复计算
//优化1.1
#include
#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;
}
/* 你的代码将被嵌在这里 */
//long double fun(int n,double x);
double f( int n, double a[], double x ){
// double sum=0;
// for(int i=0;i<=n;i++)
// {
// sum+=a[i]*fun(i,x);//这里相当于有了一个双重循环,得想办法把双重循环去掉,或者优化
// }
// return sum;
//双重循环去掉还是有点难度的,我们先想想如何优化过程:
// 分析运算步骤可知,x^n是每一次循环都要算一次,每一次都比之前多乘一次x,
// 那么我们完全可以将本次的运算结果记录下来,下一次直接在此基础上多乘一个n即可,
// 这样做就减少的重复的运算步骤,算是一种动规思想
//开启新代码:
double sum=0;
double tem=1;
tem=1;//x^0=1
sum=a[0];//sum=a[0]*tem;
for(int i=1;i<=n;i++)
{
tem*=x;
sum+=a[i]*tem;//这里相当于有了一个双重循环,得想办法把双重循环去掉,或者优化
}
return sum;
}
//long double fun(int n,double x)
//{
// long double s=1;
// for(int i=0;i
// {
// s*=x;
// }
// return s;
//}
来源:https://www.cnblogs.com/wildness-priest/p/12009438.html