2 条题解

  • 1
    @ 2024-2-18 15:18:42

    就是一个暴力枚举的题目,因为精度到小数点后两位,所以每次i+0.01,s到3就停(一共就3个根)

    #include<cmath>
    #include<iostream>
    using namespace std;
    int s;
    double a,b,c,d;
    int main()
    {
    	scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
    	for(double i=-100;i<=100&&s<3;i+=0.001)
    		if(fabs(i*i*i*a+i*i*b+i*c+d)<0.0001)
    			printf("%.02lf ",i),s++;
    	return 0;
    }
    
    • 1
      @ 2022-7-12 23:07:49
      #include<cstdio>
      double a,b,c,d;
      double fc(double x)
      {
          return a*x*x*x+b*x*x+c*x+d;
      }
      int main()
      {
          double l,r,m,x1,x2;
          int s=0,i;
          scanf("%lf%lf%lf%lf",&a,&b,&c,&d);  //输入
          for (i=-100;i<100;i++)
          {
              l=i; 
              r=i+1;
              x1=fc(l); 
              x2=fc(r);
              if(!x1) 
              {
                  printf("%.2lf ",l); 
                  s++;
              }      //判断左端点,是零点直接输出。
                              
                              //不能判断右端点,会重复。
              if(x1*x2<0)                             //区间内有根。
              {
                  while(r-l>=0.001)                     //二分控制精度。
                  {
                      m=(l+r)/2;  //middle
                      if(fc(m)*fc(r)<=0) 
                         l=m; 
                      else 
                         r=m;   //计算中点处函数值缩小区间。
                  }
                  printf("%.2lf ",r);  
                  //输出右端点。
                  s++;
              }
              if (s==3) 
                  break;             
                  //找到三个就退出大概会省一点时间
          }
          return 0;
      }
      
      • 1

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

      信息

      ID
      25
      时间
      1000ms
      内存
      125MiB
      难度
      2
      标签
      递交数
      51
      已通过
      30
      上传者