'NOIP 2010' 일원 3 차 방정식 구 해 - 분 치

제목 설명
x 3 + b * x2 + cx + d = 0 과 같은 1 원 3 차 방정식.이 방정식 의 각 계수 (a, b, c, d 는 모두 실수) 를 제시 하고 이 방정식 에 세 개의 서로 다른 실 근 (뿌리의 범 위 는 - 100 에서 100 사이) 이 존재 하고 뿌리 와 뿌리의 차 이 는 절대 치 > = 1 이 존재 한다 고 약정 한다.작은 줄 에서 큰 줄 로 이 세 개의 실 근 (뿌리 와 뿌리 사이 에 빈 칸 이 남아 있 음) 을 순서대로 출력 하고 소수점 뒤의 두 자리 까지 정확하게 해 야 한다.
입력 형식
한 줄 은 네 개의 실수 a, b, c, d 를 포함 하고 인접 한 두 개의 수 사 이 를 하나의 빈 칸 으로 분리 합 니 다.
출력 형식
한 줄 은 세 개의 실 수 를 포함 하고 이 방정식 의 세 개의 실 근 을 포함 하 며 작은 것 에서 큰 순서 로 배열 하고 인접 한 두 개의 수 사 이 를 하나의 빈 칸 으로 나 누 어 소수점 뒤의 두 자리 까지 정확하게 한다.
샘플 입력
1.0 -5.0 -4.0 20.0
샘플 출력
-2.00 2.00 5.00
분석 하 다.
이 문 제 는 사실 분 치 된 문제 다.이 문 제 를 풀기 위해 서 는 먼저 지식 을 알 아야 한다. 임 의 함수 f (x) f (x) f (x) 는 [a, b] [a, b] [a, b] [a, b] 사이 에 영점 이 있 으 면 f (a)× f ( b ) ≤ 0 f(a)\times f(b)\leq 0 f(a)×f(b)≤0。이것 도 증명 하기 쉽다. [a, b] [a, b] [a, b] 사이 에 영점 이 있 기 때문에 f (a), f (b) f (a), f (b) f (a), f (a), f (b) 는 반드시 다른 번호 가 있 기 때문에 곱셈 은 반드시 0 0 보다 작 을 것 이다.사실 그의 역명 제 도 성립 되 었 다. 그러면 이 판단 에 따라 [a, b] [a, b] [a, b] 사이 에 영점 이 있 는 지 없 는 지 를 판단 할 수 있다.그리고 2 점 만 진행 하면 됩 니 다.
코드
#include 
#include 
#include 
#include 
using namespace std;
double a,b,c,d;
double f(double x) {
	return x*x*x*a+x*x*b+x*c+d;
}
void Find(double l,double r) {
	if (r-l<0.005) {
		printf("%.2lf ",l);
		return;
	}
	double mid=(l+r)/2;
	if (f(mid)==0) {
		printf("%.2lf ",mid);
		return;
	}
	if (f(mid)*f(l)<0) Find(l,mid);
	else if (f(mid)*f(r)<0) Find(mid,r);
}
int main() {
	scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
	for (double i = -100;i < 100;i++) {
		if (f(i)==0) {
			printf("%.2lf ",i);
			continue;
		}
		if (f(i)*f(i+1)<0) Find(i,i+1);
	}
	return 0;
}

좋은 웹페이지 즐겨찾기