1 条题解
-
0
思路与算法
写出多项式的Horner求值形式,维护左端1.5、右端2.4。每次计算中点,若函数值为正则移左端到中点,否则移右端。迭代100次,最后取区间中点保留6位小数。
正确性说明
函数连续且给定区间内有唯一根。两端保持正、负异号:中点为正时保留右侧异号区间,为负或0时保留左侧闭区间。因此每轮都包含该根,区间长度减半,迭代后中点逼近唯一根。Horner形式只是代数等价变换,不改变根。
复杂度
100次常数项数多项式求值,时间O(1)、空间O(1),端点及常量初始化O(1)。一般精度ε需O(log((r-l)/ε))轮,每轮5次乘加。独立答案以70位Decimal计算230轮,六位舍入一致。
易错点
不要把正负端点的更新方向写反。无需从输入读取系数或区间,本题是固定函数无输入。Horner减少中间幂运算误差,long double及固定迭代次数足以核对本题舍入。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; long double f(long double x) { return ((((x - 15) * x + 85) * x - 225) * x + 274) * x - 121; } int main() { long double l = 1.5L, r = 2.4L; for (int i = 0; i < 100; ++i) { long double m = (l + r) / 2; if (f(m) > 0) l = m; else r = m; } cout << fixed << setprecision(6) << (l + r) / 2 << '\n'; }
- 1