【1012】计算多项式的值

【题目描述】

对于多项式f(x)=ax3+bx2+cx+d和给定的a,b,c,d,x,计算f(x)的值,保留到小数点后7位。

【输入】

输入仅一行,包含5个实数,分别是x,及参数a、b、c、d的值,每个数都是绝对值不超过100的双精度浮点数。数与数之间以一个空格分开。

【输出】

输出一个实数,即f(x)的值,保留到小数点后7位。

【输入样例】

2.31 1.2 2 2 3

【输出样例】

33.0838692

【程序实现】

直接计算

#include <stdio.h>

int main() {
    double x, a, b, c, d;
    
    scanf("%lf %lf %lf %lf %lf", &x, &a, &b, &c, &d);
    
    // 直接计算:a*x³ + b*x² + c*x + d
    double x2 = x * x;        // x²
    double x3 = x2 * x;       // x³
    double result = a * x3 + b * x2 + c * x + d;
    
    printf("%.7lf\n", result);
    
    return 0;
}

采用Horner算法

算法简单介绍如下:

秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。在西方被称作霍纳算法(Horner algorithm或Horner scheme),是以英国数学家威廉·乔治·霍纳命名的.

把一个n次多项式f(x)=a[n]x^n+a[n-1]x^(n-1)+......+a[1]x+a[0]改写成如下形式:

f(x)=a[n]x^n+a[n-1]x^(n-1))+......+a[1]x+a[0]

=(a[n]x^(n-1)+a[n-1]x^(n-2)+......+a[1])x+a[0]

=((a[n]x^(n-2)+a[n-1]x^(n-3)+......+a[2])x+a[1])x+a[0]

=......

=(......((a[n]x+a[n-1])x+a[n-2])x+......+a[1])x+a[0].

求多项式的值时,首先计算最内层括号内一次多项式的值,即

v[1]=a[n]x+a[n-1]

然后由内向外逐层计算一次多项式的值,即

v[2]=v[1]x+a[n-2]

v[3]=v[2]x+a[n-3]

......

v[n]=v[n-1]x+a[0]

这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。

(注:中括号里的数表示下标)

结论:对于一个n次多项式,至多做n次乘法和n次加法。

#include <stdio.h>

int main() {
    double x, a, b, c, d;
    
    // 读取x和参数a,b,c,d
    scanf("%lf %lf %lf %lf %lf", &x, &a, &b, &c, &d);
    
    // 计算 f(x) = a*x³ + b*x² + c*x + d
    // 使用Horner形式可以减少乘法次数: ((a*x + b)*x + c)*x + d
    double result = ((a * x + b) * x + c) * x + d;
    
    // 输出结果,保留7位小数
    printf("%.7lf\n", result);
    
    return 0;
}

Horner形式的优势:

  • 乘法次数更少(3次乘法 vs 直接计算的6次乘法)
  • 数值计算更稳定,减少舍入误差
  • 代码更简洁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

earthzhang2021

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值