C++ 백준 1008번 A/B

1008번

코딩테스트 실천 1일차부터 나눗셈 문제에 부딪혔다.
어디서부터 막혔는고 하니...


이 문제의 key는 ...

소수점을 9자리수 이상 받을 수 있는 데이터타입 지정과
소수점 고정인 것 같다.

우선 A와 B를 정수형으로 입력을 받으면 / 와 % 연산만으로 절대 원하는 값을 얻을 수 없다.


해결책은

  1. A와 B를 int형으로 입력받고 형변환 시켜주기
int main()
{
	int a, b;
	cin >> a >> b;
	
	double a1 = static_cast<double>(a);
	double b1 = static_cast<double>(b);

	return 0;
}

c++ 타입변환 연산자 static_cast<데이터타입>(변수)를 사용


2. A와 B를 double형으로 입력받기

int main()
{
	double a, b;
	cin >> a >> b;

	return 0;
}

문제에서는 정수형으로 입력받으라고 했지만 a, b를 그냥 double 형으로 선언해줘도 되는 것 같다.

그럼 왜 float이 아닌 double형인가?!

문제에서 상대오차가 10^9 이하여야 한다고 했는데,
이는 즉 소수점 이하 9자리까지는 값을 출력해줘야 오차가 허용범위 안에 들어오기 때문이다.
float과 double은 둘 다 실수형 데이터타입이지만, 정밀도에 차이가 있다.
float은 소수점 이하 6자리까지, double은 소수점 이하 15자리까지이기 때문에
이 문제에서는 double 형을 사용해야한다.

그리고 바로 나눗셈 연산자를 이용해 풀면

int main()
{
	double a, b;
	cin >> a >> b;

	cout << a / b << endl;
	return 0;
}

또 오답입니다^^..
double 데이터타입이 소수점 이하 15자리까지 나타낸다고 해도 출력은 그 이하로 되기 때문이죠.

따라서 소수점 고정이 필요합니다!

	cout << fixed;
	cout.precision(9);

cout.precision(숫자)는 유효숫자 표기 명령어다.
즉, 소수점과 상관 없이 전체 자리 숫자를 고정하는 명령어이고

cout<<fixed;는 소수점 아래부터 유효숫자를 세겠다라는 명령어입니다.


따라서
#include <iostream>

using namespace std;

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

요로코롬 해주면 정답!!!

좋은 웹페이지 즐겨찾기