Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

소수점 이하 n자리까지 나눗셈 결과를 계산하는 C++ 프로그램

양의 정수 xy, 그리고 소수점 이하 자릿수를 의미하는 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 자료형의 정밀도 한계와 무관하게 임의의 길이까지 결과를 구할 수 있다는 장점이 있습니다.