2 solutions

  • 5
    @ 2024-7-15 20:45:54
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    double a,b,c,d;
    #define f(x) (a*x*x*x+b*x*x+c*x+d)
    //宏定义函数 
    double A[1005]={};
    //用来存答案 
    int q=-1;
    //记录下标 
    signed main(){
    	cin>>a>>b>>c>>d;
    	//尺取法求零点 
    	for(double l=-100,r=100;l<=r;l+=0.01,r-=0.01){
    		if(f(l)>-0.001&&f(l)<0.001) A[++q]=l;
    		if(f(r)>-0.001&&f(r)<0.001) A[++q]=r;
    		//因为是双精度浮点数所以不能直接写==0
    		//要夹在两个小数之间 
    	}
    	sort(A,A+q+1);
    	//排序 
    	for(int i=0;i<=q;i++) cout<<fixed<<setprecision(2)<<A[i]<<' ';
    	cout<<"\n";
    	return 0;
    }
    

    尺取法双指针比二分快

    • 3
      @ 2024-7-15 13:58:57

      P1024 一元三次方程求解

      解析见代码

      #include<bits/stdc++.h>
      using namespace std;
      double exp(double a,double b,double c,double d,double x){
      	return a*pow(x,3)+b*x*x+c*x+d;//为简化计算过程,这里用函数表示 
      }
      const double eps=1e-6;//二分临界 
      double a,b,c,d,cnt=0;//cnt 用于计数 ,cnt++表示有了一个解 
      int main(){
      	cin>>a>>b>>c>>d;
      	for(int i=-100;i<=100;i++){
      		double l=i,r=i+1;//由"且根与根之差的绝对值>=1"为依据截取区间 
      		double ansl=exp(a,b,c,d,l);
      		double ansr=exp(a,b,c,d,r);
      		if(!ansl){
      			cout<<fixed<<setprecision(2)<<l<<' ';
      			cnt++; //若有解,输出,还剩两个解 
      		}
      		if(ansl*ansr<0){
      			while(r-l>=eps){
      				double mid=(l+r)/2;
      				if(exp(a,b,c,d,mid)*ansr<=0){//由题目提示可得条件 
      					l=mid;
      				}
      				else r=mid;
      			}
      			cout<<fixed<<setprecision(2)<<r<<' ';
      			cnt++;
      		}
      		if(cnt==3){
      			return 0;//若得到三个解,则输出 
      		}
      	}
      	return 0;
      }
      
      • 1

      Information

      ID
      24
      Time
      1000ms
      Memory
      125MiB
      Difficulty
      2
      Tags
      # Submissions
      90
      Accepted
      33
      Uploaded By