2 条题解

  • 0
    @ 2025-9-26 13:42:26

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

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
         double a,b,c,d;
         double as,bs,t,si;
         double x1,x2,x3;
         scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
         as=b*b-3*a*c;
         bs=b*c-9*a*d;
         t=(2*as*b-3*a*bs)/(2*sqrt(as*as*as));
         si=acos(t);
         x1=(-b-2*sqrt(as)*cos(si/3))/(3*a);
         x2=(-b+sqrt(as)*(cos(si/3)+sqrt(3)*sin(si/3)))/(3*a);
         x3=(-b+sqrt(as)*(cos(si/3)-sqrt(3)*sin(si/3)))/(3*a);
         printf("%.2lf %.2lf %.2lf\n",x1,x3,x2);
         return 0;
    }
    
    • 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
      难度
      3
      标签
      递交数
      113
      已通过
      48
      上传者