15 나머지 연산하기

C 언어에서는 사칙연산 이외에도 나머지 연산을 제공합니다. 그런데 나머지 연산을 왜 따로 제공하는 것일까요?

나머지 연산은 나눗셈과 깊은 관계가 있습니다. 보통 3.75 / 1.5처럼 실수끼리 나눗셈을 하면 결과도 실수인 2.5가 나옵니다.

하지만 7 / 2처럼 정수끼리 나눗셈을 하면 결과는 3이 나오게 됩니다. 이때 완전히 나누어지지 않는 1이 남게 되는데 이 나머지를 구하는 연산이 나머지 연산입니다.

15.1 나머지 연산하기

이제 나머지 연산을 해보겠습니다. 다음과 같이 나머지 연산은 % 연산자를 사용하며 정수 a에서 b를 나눈 뒤 나머지를 구합니다. 만약 완전히 나누어진다면 나머지는 0입니다.

  • a % b

mod.c

#include <stdio.h>

int main()
{
    printf("%d\n", 1 % 3);    // 1: 1을 3으로 나누면 몫은 0 나머지는 1
    printf("%d\n", 2 % 3);    // 2: 2를 3으로 나누면 몫은 0 나머지는 2
    printf("%d\n", 3 % 3);    // 0: 3을 3으로 나누면 몫은 1 나머지는 0
    printf("%d\n", 4 % 3);    // 1: 4를 3으로 나누면 몫은 1 나머지는 1
    printf("%d\n", 5 % 3);    // 2: 5를 3으로 나누면 몫은 1 나머지는 2
    printf("%d\n", 6 % 3);    // 0: 6을 3으로 나누면 몫은 2 나머지는 0

    return 0;
}
1
2
0
1
2
0

나머지 연산 %는 앞의 숫자를 뒤의 숫자로 나눈 뒤 나머지만 구합니다. 여기서 몫은 나눗셈으로 구할 수 있지요.

2 % 3처럼 아예 나눌 수 없더라도 나머지를 구할 수 있습니다(몫은 0 나머지는 2). 그리고 3 % 3, 6 % 3과 같이 완전히 나누어지면 나머지는 0이 나옵니다. 따라서 나머지 연산은 특정 수의 배수인지 확인할 때 자주 사용합니다(특정 수로 나누었을 때 나머지가 0이면 배수). 그리고 어떤 수이든 0, 1, 2의 3가지 상태로 강제할 때도 사용할 수 있습니다(x % 3일 때).

나머지 연산은 정수에서만 사용할 수 있고 실수에서는 사용할 수 없습니다(컴파일 에러 발생). 또한, 7 % 0처럼 0으로 나눈 결과의 나머지는 구할 수 없습니다.

참고 | 실수의 나머지 구하기

실수끼리 나누었을 때 나머지는 math.h 헤더 파일의 fmod, fmodf, fmodl 함수로 구할 수 있습니다. 여기서 fmod 함수는 double형 실수, fmodffloat형 실수, fmodllong double형 실수일 때 사용합니다.

  • fmod(나누어지는수, 나누는수);
    • double fmod(double _X, double _Y);
  • fmodf(나누어지는수, 나누는수);
    • float fmodf(float _X, float _Y);
  • fmodl(나누어지는수, 나누는수);
    • long double fmodl(long double _X, long double _Y);

fmod.c

#include <stdio.h>
#include <math.h>    // fmod 함수가 선언된 헤더 파일

int main()
{
    // 실수의 나머지 연산은 fmod, fmodf, fmodl 함수를 사용

    double num1 = 10.843;
    double num2 = 3.79;
    printf("%f\n", fmod(num1, num2));    // 3.263000

    float num3 = 10.843f;
    float num4 = 3.79f;
    printf("%f\n", fmodf(num3, num4));    // 3.263000

    long double num5 = 10.843l;
    long double num6 = 3.79l;
    printf("%Lf\n", fmodl(num5, num6));    // 3.263000

    return 0;
}

실행 결과

3.263000
3.263000
3.263000
실행 결과는 Visual Studio, Windows 기준입니다.
최근 수정: 2018년 2월 5일, 월요일, 오후 3:35