이번 문제는 나눗셈 문제입니다. 원래 이 전에 뺄셈과 곱셈 문제가 두 개 더 있지만 06번 강좌랑 같은 내용을 다루기 때문에 중복이 돼서 바로 나눗셈 문제로 넘어온 점 양해 부탁드립니다. 이번 문제를 살짝 미리 소개하자면 정수만 사용한 저번과는 달리, 이번에는 실수를 사용해야 합니다. 새로운 변수에 대해서 배울 차례죠 ㅎㅎ
입출력과 사칙연산의 8번째 문제 A/B(#1008) 문제네요! 이제 슬슬 끝이 보입니다. 이번에는 두 정수를 입력받아 나눈 값을 출력을 해야 하는데요, 덧셈, 뺄셈, 곱셈과는 다르게 나눗셈은 소수점이 나올 수가 있죠. 그럼 코딩을 바로 시작해 보도록 할까요?
#include <stdio.h>
int main(void) {
int a, b;
scanf("%d %d", &a, &b);
printf("%.9lf\n", (double)a/b);
return 0;
}
저번과 비슷하지만 조금 다른 부분이 하나 보이죠? printf에서 사용된 형식 지정자는 처음 보는 형식이고 a 변수 앞에 있는 (double)은 새롭게 추가되었네요. 바로 이 부분 때문에 나눗셈은 뺄셈, 곱셈처럼 전 강좌랑 통합되지 않고 따로 떨어지게 됐죠.
우선 문제에서 정수를 입력받으라 했으니 5번 줄 까지는 저번과 같게 int 변수와 정수 형식 지정자를 사용해야 합니다. 하지만 정수를 정수로 나누게 되면 몫도 정수로 나오기 때문에 1/3 같이 정수로 나누어 떨어지지 않는 수들은 소수점을 버리게 되는데요, 1/3을 하면 0.3333이 아니라 소수점을 버린 0이 되어버리죠. 소수점을 사용하고 싶다면 나누는 숫자 중 하나라도 실수여야 합니다. 실수 ÷ 정수, 정수 ÷ 실수, 실수 ÷ 실수의 몫들은 모두 소수점이 포함되는 실수로 나오게 되죠. 실수형 변수로는 대표적으로 float(소수점 6자리까지 표현)와 double(소수점 15자리까지 표현)이 있습니다.
printf("%.9lf\n", (double)a/b);
문제에서는 실제 정답과 출력 값의 오차가 소수점 9자리 이하면 정답이라 했기 때문에 소수점 9자리까지는 출력이 돼야 합니다. 그렇기 때문에 소수점 15자리까지 출력이 가능한 double 형식을 사용해야 하죠. int가 아닌 double을 출력해야 하기 때문에 형식 지정자를 %d가 아닌 %lf를 사용해야 하는데요, 소수점을 9자리로 맞추기 위해서 %.9lf라고 적으면 됩니다. 그러면 무조건 소수점 9자리까지 나타나게 되는데요, 1/2처럼 소수점 한자리만 있는 값들도 0.500000000 이렇게 0으로 출력됩니다.
a와 b 변수는 정수 형식이죠. 위에서 몫을 실수로 나타내기 위해서는 하나라도 실수가 포함되어있다 했는데요, 그렇다면 둘 중 하나를 정수에서 실수로 변환해 주어야 합니다. 변환하는 방법은 아주 간단한데요, 위 코드에서 보이는 것처럼 변수 앞에 (double)을 붙여주면 됩니다. 그러면 이제 변수 a는 int가 아닌 double 형식의 변수가 된 겁니다. 주의할 점은 (double)(a/b)라고 적으면 안 되는데요, 수학에서 괄호 안에 있는 공식을 먼저 푸는 것처럼 (a/b)가 되어버리면 실수로 변환하기 전에 정수인 상태에서 먼저 나눗셈을 하게 됩니다. 그러면 소수점이 사라지죠.
자, 이제 테스트를 해 봅시다. 실행시킨 뒤 정수 두 개를 입력하면 몫이 소수점 9자리까지 잘 나오네요.
제출을 해 봅시다! 백준으로 돌아와서 언어를 C로 선택한 뒤 제출해 주세요.
성공!
'프로그래밍 > 백준' 카테고리의 다른 글
백준으로 배우는 C 언어 09. 곱셈 (4) | 2020.03.09 |
---|---|
백준으로 배우는 C 언어 08. 사칙연산 (0) | 2020.03.09 |
백준으로 배우는 C 언어 06. A + B (3) | 2020.03.08 |
백준으로 배우는 C 언어 05. 개 (1) | 2020.03.07 |
백준으로 배우는 C 언어 04. 고양이 (1) | 2020.03.07 |