2 분 1238: 1 원 3 차 방정식 의 풀이

11166 단어 이분
[제목 설명] 예 를 들 어 ax3 + bx2 + 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.02.00 5.00
사고: 1 원 3 차 함수 에 대한 가이드, 1 원 2 차 방정식, 그리고 가이드 함 수 는 0 과 같 습 니 다. 공식 법 으로 가이드 함수 의 두 개의 뿌리 를 계산 합 니 다. 이 두 개의 뿌리 는 바로 두 개의 극치 점 입 니 다. 각각 x1 과 x2 로 기록 한 다음 에 이분법 에 따라 각각 [- 100, x1], [x1, x2], [x2, 100] 이 세 구간 에서 영점 을 찾 습 니 다.
#include 
#include 
#include 
#include 
#define ll long long
#define inf 0x3f3f3f3f

using namespace std;
const int N=1e4+5;
double a,b,c,d;

double f(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
}
double g(double L,double R)
{
    double l=L,r=R,mid,t;
    int flag=f(l)>0?1:0;
    while(fabs(l-r)>1e-3)
    {
        mid=(l+r)/2;
        t=f(mid);
        if(t==0)
            break;
        else if(t>0)
        {
            if(flag)
                l=mid;
            else
                r=mid;
        }
        else
        {
            if(flag)
                r=mid;
            else
                l=mid;
        }
    }
    return mid;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> a >> b >> c >> d;
    double x1=(-2*b+sqrt(4*b*b-12*a*c))/(6*a);
    double x2=(-2*b-sqrt(4*b*b-12*a*c))/(6*a);
    if(x1>x2)
        swap(x1,x2);
    printf("%.2f %.2f %.2f
"
,g(-100,x1),g(x1,x2),g(x2,100)); return 0; }

좋은 웹페이지 즐겨찾기