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
타입 실수,fmodf
는float
타입 실수,fmodl
은long 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
으로 나머지 연산을 하지 않도록 주의한다.
- 참고로 다음과 같이 모두 변수를 사용하여 연산해도 상관없다.
음수의 나머지 연산
- 음수를 나머지 연산했을 때 어떻게 되는지 알아보자.
#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
의 부호를 따른다.