【题目描述】
对于多项式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次乘法)
- 数值计算更稳定,减少舍入误差
- 代码更简洁
1500

被折叠的 条评论
为什么被折叠?



