PTA--6-2多项式求值

博客探讨了如何实现计算多项式在特定点值的函数,强调了正解中动态规划思想的重要性,以及从错误中学习的经验总结。通过举例说明了在解决此类问题时应该注意的优化方法,包括先展开式子、简化循环以及尝试不同的思考方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑​i=0​n​​(a[i]×x​i​​) 在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].

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值