백준 웹사이트 "1008번 - A / B" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#include <stdio.h>
int main(void){
int A, B;
scanf("%d %d", &A, &B);
printf("%.9f\n", (double) A/B);
return 0;
}
문제 풀이
두 정수 A, B를 선언하고, 입력받고, 출력하는 과정은 1000번 문제와 동일합니다. Line 5의 &A, &B에 관한 내용은 아래 1000번 문제 풀이를 확인해주세요.
이 문제의 경우, 정답률이 높은 다른 문제들에 비해 훨씬 낮은 34.271%(2021.12.19 기준)의 정답률을 보입니다. 이것은 아마 Line 7에서 실수하기 쉬워서일텐데요, 앞의 문제들과 다르게 "%d"를 사용하지 않습니다. printf 구문에서 "%d"는 정수(integer)의 출력을 의미합니다. 따라서 "%d"를 사용하면 A/B의 정수 부분만 출력되어, 1/3의 결과를 0으로 계산합니다. 우리는 정수의 출력이 아닌, 소수의 출력을 원하므로 소수의 출력을 의미하는 "%f"를 사용해야 합니다.
그러면 "%f"로 하여 Line 7을 아래와 같이 작성하면 어떤 결과가 나올까요?
printf("%f\n", A/B);
결과는 다음과 같습니다.
0.000000
우리가 원하는 0.333333333이라는 답과는 꽤나 차이가 있죠? 두 가지 문제가 있습니다. 첫 번째로는 A, B가 'int'형으로 선언 되어 있어, A/B도 계산된 후 자동으로 'int'형으로 저장된다는 것입니다. 따라서 0.33333.. 이라는 계산 결과를 얻은 후 정수 부분인 0만 저장되어, 이 값을 "%f"로 불러오기에 0.00000..의 값이 나옵니다. A/B가 계산된 후에 이를 정수(int)가 아닌 소수(double)로 저장하도록, A/B 앞에 '(double)'을 추가합니다. 이것이 바로 '자료형 변환 (type casting)'이라는 과정입니다.
두 번째 문제는 소수점 아래 여섯째 자리까지만 나타난다는 점인데, 소수점 아래 아홉째 자리까지 나타내기 위해 "%f"가 아닌 "%.9f"을 사용합니다.
이러한 부분들을 고쳐 위의 소스 코드와 같이 수정하면, 아래와 같은 출력이 나타납니다.
0.333333333
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 10430번 - 나머지 (0) | 2021.12.20 |
---|---|
[백준/C언어] 10869번 - 사칙연산 (0) | 2021.12.20 |
[백준/C언어] 10998번 - A × B (0) | 2021.12.19 |
[백준/C언어] 1001번 - A - B (0) | 2021.12.19 |
[백준/C언어] 1000번 - A + B (0) | 2021.12.18 |