Skip to content

10. 나머지 연산자


1. 키워드

  • 나머지 연산자


2. 나머지 연산하기

  • 다음과 같이 나머지 연산은 % 연산자를 사용하며 정수 a에서 b를 나눈 뒤 나머지를 구한다.
  • 만약 완전히 나누어진다면 나머지는 0이다.


#include <stdio.h>

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

    return 0;
}

// 1
// 2
// 0
// 1
// 2
// 0


  • 나머지 연산 %는 앞의 숫자를 뒤의 숫자로 나눈 뒤 나머지만 구한다.
  • 여기서 몫은 나눗셈으로 구할 수 있다.
  • 2 % 3처럼 아예 나눌 수 없더라도 나머지를 구할 수 있다.
  • 그리고 3 % 3, 6 % 3과 같이 완전히 나누어지면 나머지는 0이 나온다.
  • 따라서 나머지 연산은 특정 수의 배수인지 확인할 때 자주 사용한다.
  • 그리고 어떤 수이든 0, 1, 2의 3가지 상태로 강제할 때도 사용할 수 있다.
  • 나머지 연산은 정수에서만 사용할 수 있고 실수에서는 사용할 수 없다.
  • 또한, 7 % 0처럼 0으로 나눈 결과의 나머지는 구할 수 없다.


실수의 나머지 구하기

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


#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


3. 변수 하나에서 나머지 연산하기

  • 이번에는 변수 하나에서 나머지 연산을 하는 방법을 알아보자.


#include <stdio.h>

int main()
{
    int num1 = 7;

    num1 = num1 % 2; // num1에서 2를 나눈 뒤 나머지를 구하여 다시 num1에 저장

    printf("%d\n", num1); // 1

    return 0;
}


  • num1 = num1 % 2;num1에서 2를 나눈 뒤 나머지를 구하여 다시 num1에 저장한다.
  • 즉, 계산 결과를 같은 변수에 계속 유지한다.
  • 단, 0으로 나머지 연산을 하지 않도록 주의한다.


  • 나머지 연산도 변수를 두 번 입력하지 않도록 나머지를 구한 후 할당 %= 연산자를 제공한다.


#include <stdio.h>

int main()
{
    int num1 = 7;

    num1 %= 2; // num1에 2를 나눈 뒤 나머지를 구하여 다시 num1에 저장

    printf("%d\n", num1); // 1

    return 0;
}


  • num1 %= 2;는 나머지 연산과 할당 연산을 동시에 처리한다.
  • 즉, num1 = num1 % 2;의 축약형이다.
  • 단, 0으로 나머지 연산을 하지 않도록 주의한다.


  • 참고로 다음과 같이 모두 변수를 사용하여 연산해도 상관없다.


int num1 = 7;
int num2 = 2;

num1 %= num2;
num1 = num1 % num2;


음수의 나머지 연산

  • 음수를 나머지 연산했을 때 어떻게 되는지 알아보자.


#include <stdio.h>

int main()
{
    printf("%d\n", 5 % (-3));    // 2
    printf("%d\n", (-5) % 3);    // -2
    printf("%d\n", (-5) % (-3)); // -2

    return 0;
}


  • C99 표준에서 나머지 연산자는 a = (a / b) * b + a % b로 정의하고 있다.
  • 따라서 이 식에 앞의 값들을 대입해 보면 왜 그런지 알 수 있다.
  • 결론적으로 a % b를 연산하면 결과는 b의 부호는 무시하고, a의 부호를 따른다.

References