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

부동소수점 없이 1/n의 소수점 아래 k자리 출력하기 – C 언어 구현


문제 개요

양의 정수 n과 자릿수 k가 주어졌을 때, 1/n의 계산 결과를 소수점 아래 k자리까지 출력하는 것이 목표입니다.

부동소수점(float, double) 자료형을 활용하면 비교적 쉽게 구현할 수 있지만, 여기서는 부동소수점 연산 없이 정수 연산만으로 해결하는 방법을 소개합니다. 부동소수점은 표현 가능한 정밀도에 한계가 있어 요구되는 자릿수가 많아질 경우 오차가 발생할 수 있기 때문에, 정수 기반 접근이 더 안정적입니다.

입력 및 출력 예시

입력 — n=5, k=5
출력 — 20000

즉, n=5이고 k=5라면 1/5 = 0.20000이므로 소수점 아래 5자리에 해당하는 "20000"을 출력해야 합니다.

알고리즘

핵심 아이디어는 손으로 나눗셈을 계산할 때 사용하는 장제법(세로나눗셈)입니다. 각 단계에서 현재 나머지에 10을 곱한 값을 n으로 나누면 그 자리의 숫자(몫)를 얻을 수 있고, 남은 나머지는 다음 자리 계산에 그대로 재사용합니다.

시작
1단계 → 정수형 변수 n=9, k=7, remain=1, i를 선언한다
2단계 → i=0부터 i<k가 될 때까지 반복
         ((10 × remain) ÷ n)의 몫을 출력한다
         remain = (10 × remain) % n 으로 갱신한다
3단계 → 반복 종료
종료

C 언어 구현 예제

#include <stdio.h>

int main() {
    int n = 9, k = 7, remain = 1, i; // n은 1/n의 분모, k는 소수 자릿수
    printf("first %d digits of %d are : ", k, n);
    for (i = 0; i < k; i++) {
        printf("%d", ((10 * remain) / n));
        remain = (10 * remain) % n;
    }
    return 0;
}

실행 결과

위 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 출력됩니다.

first 7 digits of 9 are : 1111111

n=9인 경우 1/9 = 0.111111…처럼 무한반복 소수가 되므로, 소수점 아래 첫 7자리는 모두 1로 채워집니다.

동작 원리 살펴보기

n=5, k=5인 경우를 단계별로 추적해 보면 다음과 같습니다.

  • 1단계: remain=1 → 10×1÷5의 몫은 2, 나머지는 0 → "2" 출력
  • 2단계: remain=0 → 10×0÷5의 몫은 0, 나머지는 0 → "0" 출력
  • 3~5단계: remain이 계속 0이므로 "0"이 반복 출력됨

최종적으로 "20000"이 출력되며, 이는 1/5 = 0.20000과 정확히 일치합니다. 이처럼 나머지 기반 반복 계산만으로 부동소수점 없이도 원하는 자릿수까지 정확한 소수 값을 얻을 수 있습니다.