백준/C++

[백준] 1008번: A/B | C++ 풀이

성실한 당근농부 2023. 5. 2. 23:43

# 문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

 

 


 

# 풀이

앞서 더하고 빼는 문제를 풀다가 풀었더니... 처음엔 당당하게 A/B 적고 틀렸다!

이 문제를 풀이할 땐 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이라는 문구에 주목해야 한다.

이를 위해서는 소수 9자리 이상 출력을 해야 한다는 뜻인데, 정답 소스코드를 보며 필요한 개념을 정리해보자.

 

#include <iostream>
using namespace std;

int main() {
 
    double a, b;
    cin >> a >> b;
 
    cout.precision(15);
    cout << fixed;
    cout << a/b;
    
    return 0;
}

 

출력되는 소수점의 자리수를 조정하기 위해

std::fixedstd::cout.precision()을 사용하였다.

 

 

📌 std::fixed

 std::fixed는 부동 소수점 값을 고정 소수점 표기법으로 변경해준다. (여기서 부동 소수점이란, 浮動 소수점이 떠다닌다는 의미로 소수점 위치를 고정해두지 않음을 뜻한다) 이때 소수점 이하 자릿수는 이어서 살펴볼 precision에 의해 지정된 만큼 표기된다.

 기존에 설정되어 있던 부동 소수점 표기법에서는 정밀도 필드가 소수점 앞뒤에 표시할 수 있는 최대의 의미있는 자릿수를 지정하지만, 고정 소수점 표기법으로 변경 시에는 정밀도 필드가 소수점 이하 몇 자리를 표시할 것인지 정확하게 지정하게 된다.

 

 

📌 std::cout.precision()

get (1) streamsize precision() const;
set (2) streamsize precision (streamsize prec);

 

 

std::cout.precision()은 정밀도 필드가 소수점 이하 몇 자리를 표시할 것인지 정확하게 지정한다. 소수점 앞에 있는 숫자는 정밀도에 영향을 받지 않으며, 소수점 이하에 0이 붙는 경우에도 그 갯수만큼 표시된다.

 

 


 

자 이제 필요한 개념을 확인했으니 소스코드를 다시 살펴보자.

 

double a, b;
cin >> a >> b;

소수 9자리 이상 출력해야 하므로, 입력값으로 주어지는 A와 B를 double형으로 받아주었다.

(double은 62비트, 8바이트의 크기를 갖는 실수형 자료형으로 15~16자리의 유효숫자를 표현할 수 있음)

 

cout.precision(15);
cout << fixed;
cout << a/b;

그리고 double형이 표현할 수 있는 유효숫자의 자릿수와 문제에서 필요로 하는 자릿수를 감안하여 precision 값을 15로 주고, fixed를 통해 고정 소수점 표기법으로 변경해주었다.

필요한 처리들을 해준 후, cout << a/b로 결과를 확인해보면 정답임을 확인할 수 있다.

 

 

 

 


 

 

1008번: A/B

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

728x90