양의 정수 x와 y, 그리고 소수점 이하 자릿수를 의미하는 n이 주어졌을 때, 두 수의 나눗셈 결과를 소수점 n자리까지 정확하게 계산해 출력하는 프로그램을 만들어 보겠습니다.
예시
입력: x = 36, y = 7, n = 5
출력: 5.14285
입력: x = 22, y = 7, n = 10
출력: 3.1428571428
부동소수점 자료형(float, double)은 표현 가능한 유효 숫자에 한계가 있기 때문에, 요구하는 자릿수가 길어지면 오차가 발생할 수 있습니다. 따라서 정수 연산만으로 나머지를 반복적으로 처리하는 방식이 더 안정적입니다.
문제 해결 접근 방법
- 피제수 a, 제수 b, 그리고 소수점 자릿수 n을 입력받습니다.
- b가 0이면 나눗셈 결과는 무한대(Infinite)이므로 별도로 처리합니다.
- a가 0이면 어떤 수로 나누더라도 결과는 항상 0입니다.
- n이 1보다 크면 나머지를 구한 뒤 피제수에서 빼고, 결과에 10을 곱해 다음 자릿수를 계산하는 과정을 반복합니다.
- 최종 결과를 출력합니다.
알고리즘
START
Step 1-> 소수점 n자리까지 나눗셈을 수행하는 함수 선언
void compute_division(int a, int b, int n)
IF (b == 0)
"Infinite" 출력
End
IF (a == 0)
0 출력
End
IF (n <= 0)
a / b 출력
End
IF (((a > 0) && (b < 0)) || ((a < 0) && (b > 0)))
"-" 출력
a = a > 0 ? a : -a
b = b > 0 ? b : -b
End
int dec = a / b 로 초기화
FOR int i = 0 ~ i <= n, i++
dec 출력
a = a - (b * dec)
IF (a == 0)
break
End
a = a * 10
dec = a / b
IF (i == 0)
"." 출력
End
Step 2-> main() 함수에서
int a = 36, b = 7, n = 5 로 설정
compute_division(a, b, n) 호출
STOP
C++ 구현 코드
아래 코드는 위 알고리즘을 그대로 C++로 구현한 예제입니다. 음수 입력에 대한 부호 처리와 나눗셈이 딱 떨어지는 경우(나머지가 0)의 조기 종료 로직도 포함되어 있습니다.
#include <bits/stdc++.h>
using namespace std;
void compute_division(int a, int b, int n) {
// 제수가 0이면 무한대 처리
if (b == 0) {
cout << "Infinite" << endl;
return;
}
// 피제수가 0이면 결과는 항상 0
if (a == 0) {
cout << 0 << endl;
return;
}
// 소수점 자릿수가 없으면 정수 나눗셈만 수행
if (n <= 0) {
cout << a / b << endl;
return;
}
// 부호가 다른 경우 음수 출력 후 절댓값으로 변환
if (((a > 0) && (b < 0)) || ((a < 0) && (b > 0))) {
cout << "-";
a = a > 0 ? a : -a;
b = b > 0 ? b : -b;
}
int dec = a / b;
for (int i = 0; i <= n; i++) {
cout << dec;
a = a - (b * dec); // 나머지 계산
if (a == 0) // 나누어 떨어지면 종료
break;
a = a * 10; // 다음 자릿수 계산 준비
dec = a / b;
if (i == 0)
cout << "."; // 첫 번째 반복 후 소수점 출력
}
}
int main() {
int a = 36, b = 7, n = 5;
compute_division(a, b, n);
return 0;
}
실행 결과
5.14285
동작 원리 정리
이 프로그램의 핵심은 손으로 나눗셈을 할 때와 동일한 원리를 사용한다는 점입니다. 먼저 정수 부분을 구하고, 남은 나머지에 10을 곱해 다음 소수 자릿수를 하나씩 얻어냅니다. 이 과정을 원하는 자릿수(n)만큼 반복하기 때문에 double 자료형의 정밀도 한계와 무관하게 임의의 길이까지 결과를 구할 수 있다는 장점이 있습니다.