알고리즘 훈련 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; }

좋은 웹페이지 즐겨찾기