알고리즘 훈련 1 원 3 차 방정식 풀이 (상황 2 분)
1586 단어 ... 2 점
x
3+bx
2 + cx + d = 0 과 같은 1 원 3 차 방정식.이 방정식 의 각 계수 (a, b, c, d 는 모두 실수) 를 제시 하고 이 방정식 에 세 개의 서로 다른 실 근 (뿌리의 범 위 는 - 100 에서 100 사이) 이 존재 하고 뿌리 와 뿌리의 차 이 는 절대 치 > = 1 이 존재 한다 고 약정 한다.실근 세 개 를 요구 하 다.
입력 형식
네 개의 실수: a, b, c, d
출력 형식
작은 줄 에서 큰 줄 로 이 세 개의 실 근 (뿌리 와 뿌리 사이 에 빈 칸 이 남아 있 음) 을 순서대로 출력 하고 소수점 뒤의 두 자리 까지 정확하게 출력 한다.
샘플 입력
1 -5 -4 20
샘플 출력
-2.00 2.00 5.00
데이터 규모 와 약정
|a|,|b|,|c|,|d|<=10
#include
#include
#include
#include
typedef long long ll;
using namespace std;
const double eps=1e-9;
const int maxn=1010;
double a,b,c,d;
void get_x(double &x1,double &x2){
double A=3.0*a,B=2.0*b,C=c;
double tmp=sqrt(B*B-4.0*A*C);
x2=(-1*B+tmp)/(2.0*A);
x1=(-1*B-tmp)/(2.0*A);
}
int check(double x,int flag){
double tmp=a*x*x*x+b*x*x+c*x+d;
if(tmp<0){
if(!flag) return 1;
return 0;
}
else{
if(!flag) return 0;
return 1;
}
}
double solve(double l,double r,int flag){
double mid,ans;
while(r-l>=eps){
mid=(r+l)/2.0;
if(check(mid,flag)){
l=mid;
ans=mid;
}
else
r=mid;
}
return ans;
}
int main(){
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
double x1,x2;
get_x(x1,x2);
int flag=1;
//printf("x1:%.2f x2:%.2f
",x1,x2);
if(a>0) flag=0;
double ans1=solve(-1e9,x1,flag);
flag=flag^1;
double ans2=solve(x1,x2,flag);
flag=flag^1;
double ans3=solve(x2,1e9,flag);
printf("%.2f %.2f %.2f
",ans1,ans2,ans3);
return 0;
}