1 条题解

  • 0
    @ 2026-10-26 13:21:31

    思路与算法

    写出多项式的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

    信息

    ID
    1755
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者