본문 바로가기

Notice
Recent Posts
Recent Comments
«   2024/06   »
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
Tags
더보기
Archives
관리 메뉴

1008. A/B 본문

알고리즘 문제풀기/백준(Acmicpc)

1008. A/B

알광(Algwang) 2018. 12. 30. 20:34

문제링크 : https://www.acmicpc.net/problem/1008


간단한 문제지만 확실히 알아야하는 문제이다. Codeforces 라운드에서 많이 틀렸던 유형이기도 하다.


정수형의 수들은 알고리즘 문제를 해결하며 많이 다뤄보지만 소수점은 많이 다뤄보지 않는다. 그래서 확실하게 알아놓지 않으면 갑작스럽게 문제가 생겼을 때 당황하기 쉽다.


먼저, 오답이다.



- 소스 코드(오답) -


#include<iostream>
using namespace std;
int main(void) {
float a, b;
cin >> a >> b;
float c = a / b;
printf("%.9f", c);
}




소수점을 계산하기 위해 float으로 입력을 받았다. 그리고 10^-9 이하의 오차만 허용하므로 .9f를 사용해 아홉번 째 자리까지 출력하였다.

이제 결과를 보자.




?!


예상하지도 못한 4가 나왔다. 이러한 현상이 왜 발생하는가?


컴퓨터에서 10진수를 2진수로 바꾸면서 발생한 구조적인 문제이다.


이런 오차없이 실수를 사용하고 싶다면


float의 가수는 6~7자리


double의 가수는 15~16자리라는 것을 기억하자.


즉, 이 문제는 double을 이용해서 해결해야 한다.


자세한 설명은 아래 링크의 블로그를 확인하면 된다.


http://karmainearth.tistory.com/143


- 소스코드 -

#include<iostream>
using namespace std;
int main(void) {
double a, b;
scanf("%lf %lf", &a, &b);
printf("%.9lf", a/b);
}




'알고리즘 문제풀기 > 백준(Acmicpc)' 카테고리의 다른 글

14720. 우유 축제  (0) 2019.01.15
11727. 2×n 타일링 2  (0) 2019.01.15
1967. 트리의 지름  (0) 2019.01.14
3111. 검열 ( 오답노트 )  (0) 2018.12.20
16510. Predictable Queue  (0) 2018.11.30
Comments