개발 지식/알고리즘

[백준] 14786 Ax+Bsin(x)=C (2)

트리맨스 2019. 5. 24. 13:09
반응형


문제: a,b,c 가 주어졌을 경우에 Ax+Bsin(x)=C 를 만족하는 x를 찾으면 된다.     

단, 0<b<=a<100000 이고, 0<c<=100000 이라는 조건이 있다. 그리고 정답과의 오차는 10^-9 까지 인정한다.


백준 사이트에 가보면 이 문제의 원형 버전이 있는데 문제에 무언가 오류가 있는 모양이다. 질의응답을 보면 구제할수 없는 문제라고 하는 사람도 있다.


일단 문제를 천천히 생각해 보자. 위 식을 이항 시켜주면  Ax+Bsin(x)-C=0이 나온다.


먼저 x가 1보다 큰 경우하고 1보다 작은 경우를 생각해보자.


만약 x가 1보다 작은 경우라면?

정수 부분이 0인 것을 인식 시켜줘야 한다.

그리고 나서 0.1부터 0.9까지 식에 대입해 준 다음에, Ax+Bsin(x)-C>0 을 만족하는 수 바로 전에서 소수점 2번째 자리부터 계산해준다. 예를들어 0.3까지는 음수였다가 0.4부터 양수가 나온다면, 0.3을 저장하고 0.30부터 0.39까지 일일이 계산해 보는 것이다. 이러한 식으로 한 자리씩 소수점 k 자리를 계속 구해 나간다.


만약 x가 1보다 큰 경우라면?

문제의 조건을 천천히 읽어보자. a,b,c의 범위를 읽어 보면 x의 최대값은 10만에 조금 못 미치는 실수일 것이다. 즉, x의 정수부의 최대값은 99999인 것이다. 위에서 했던 방법과 마찬가지로 1부터 99999까지 대입해서 양수가 나오는 구간 바로 전에 있던 값을 저장시키고, 소수점도 같은 방식으로 계산해 나간다.

마지막으로, 소수점 자릿수를 신경써서 출력해 준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <math.h>
 
double ssin(double a,double b,double c)
{
    double x=1.0,k=1.0;
    int temp=0;
    
    while(x<=1000000)  //정수부 확인하기  
    {
        if(a*x+b*sin(x)-c>0)
        {
            x-=1.0;
            break;
        }
        x+=1.0;
    }
    
    for(int i=0;i<=9;i++)  //소수부 확인하기(0에서 9까지) 
    {
        exit:
        if(temp==11break;  //11번째까지 확인하면 for문 종료  
        if(a*x+b*sin(x)>c)  //함수식이 0보다 클 경우  
        {
            x-=k/10.0;    //
            temp++; i=0;  //자릿수 이동  
            k/=10.0;      //-1승 자리의 소수점 확인하러 가기  
            goto exit;    //exit로 이동  
        }
        if(i==9)  // 소수점 부분이 만약 9라면?  
        {
            temp++; i=0;  //자릿수 이동  
            k/=10.0;      //-1승 자리의 소수점 확인하러 가기  
            goto exit;    //exit로 이동
        }
        x+=k/10.0;
    }
    
    return x;
}
 
int main()
{
    double a,b,c;
    
    scanf("%lf %lf %lf",&a,&b,&c);
    
    printf("%.10lf",ssin(a,b,c));
 } 
cs


반응형

'개발 지식 > 알고리즘' 카테고리의 다른 글

[백준] 9095 1,2,3 더하기  (0) 2019.06.06
[백준] 1463 1로 만들기  (0) 2019.05.27
[백준] 1010 다리 놓기  (0) 2019.05.08
[백준] 2609 최대공약수와 최소공배수  (0) 2019.03.24
[백준] 1929 소수 구하기  (0) 2019.03.19