1 条题解

  • 0
    @ 2025-3-1 8:54:14
    #include <bits/stdc++.h>
    using namespace std;
    
    const double EPS = 1e-6; // 精度控制
    
    double a, b, c, d;
    
    // 定义方程 f(x) = ax^3 + bx^2 + cx + d
    double f(double x) {
        return a * x * x * x + b * x * x + c * x + d;
    }
    
    // 二分法求解方程的根
    double solve(double l, double r) {
        while (r - l > EPS) {
            double mid = (l + r) / 2;
            if (f(mid) * f(l) < 0) {
                r = mid;
            } else {
                l = mid;
            }
        }
        return l;
    }
    
    int main() {
        cin >> a >> b >> c >> d;
    
        // 遍历区间 [-100, 100],步长为 1
        for (double i = -100; i <= 100; i++) {
            double l = i, r = i + 1;
    
            // 检查 f(l) 和 f(r) 是否异号
            if (f(l) == 0) {
                printf("%.2f ", l); // 如果 f(l) 为 0,直接输出 l
            } else if (f(l) * f(r) < 0) {
                double root = solve(l, r); // 使用二分法求解根
                printf("%.2f ", root);
            }
        }
    
        return 0;
    }
    
    
    • 1

    [NOIP 2001 提高组] 一元三次方程求解

    信息

    ID
    5082
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    103
    已通过
    43
    上传者