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형 실수, fmodf는 float형 실수, fmodl은 long 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 기준입니다.