C & C++

[C언어/C++] 나눗셈 연산의 원리, 몫과 나머지를 구하는 방법

jimmy_AI 2022. 5. 15. 21:37
반응형

C언어(C++ 포함) 나누기, 몫, 나머지

C언어와 C++에서 나눗셈 연산이 수행되는 원리를 살펴보고

몫과 나머지를 구하는 방법에 대해서도 다루어보도록 하겠습니다.

 

 

나눗셈 연산 원리

5 나누기 2의 연산 결과는 2.5라는 사실을 쉽게 알 수 있지요.

그러나 C언어나 C++에서 해당 연산을 수행해보면 그냥 2가 출력되는 것을 볼 수 있습니다.

심지어는 실수 자료형으로 값을 선언해도 2.5가 아닌 2.0이 저장되고 있습니다.

#include <stdio.h>

int main(){

int a = 5 / 2;
double b = 5 / 2;

printf("%d\n", a); // 2
printf("%.1f\n", b); // 2.0
  
}

이와 같은 현상이 발생하는 이유는 정수 자료형 간의 연산은 기본적으로 정수를 반환하도록

설정되어있기 때문입니다.

 

2.5라는 결과를 제대로 반환받기 위해서는 양쪽 숫자 중 적어도 한 쪽은 실수 자료형으로

선언을 해주어야 합니다.

#include <stdio.h>

int main(){

double c = 5.0 / 2;
double d = 5 / 2.0;
double e = (double)5 / 2; // 강제 형변환을 이용한 케이스

printf("%.1f\n", c); // 2.5
printf("%.1f\n", d); // 2.5
printf("%.1f\n", e); // 2.5
  
}

위와 같이 최소 한 쪽이라도 5.0처럼 실수 자료형으로 명시를 해주시거나 혹은

나눗셈을 수행하기 전에 강제 형변환을 먼저 거쳐주어야 결과가 제대로 반환됨을 유의해주세요.

반응형

몫을 구하는 방법

이제 C언어나 C++에서 두 수를 나눈 몫을 구하는 방법을 정리해보겠습니다.

 

먼저, 정수끼리의 연산의 경우에는 위에서 다룬 원리대로 나눗셈의 결과가 몫으로 반환되기에

단순히 나눗셈을 수행해주면 됩니다.

#include <stdio.h>

int main(){

int a = 5 / 3;
int b = 10 / 2;
int c = 7 / -3;

printf("%d\n", a); // 1
printf("%d\n", b); // 5
printf("%d\n", c); // -2
  
}

 

만일, 실수 자료형이 포함된 두 수 간의 나누기에서의 몫을 구하고 싶다면

나눗셈을 수행한 결과를 정수 자료형으로 선언받거나, 혹은 강제 형변환을 이용하면 됩니다.

#include <stdio.h>

int main(){

int d = 0.7 / 0.2; // 정수로 선언받기 이용
  
printf("%d\n", d); // 3

// 강제 형변환 이용
printf("%.1f\n", (0.7 / 0.2)); // 3.5
printf("%d\n", (int)(0.7 / 0.2)); // 3
  
}

 

 

나머지를 구하는 방법

C, C++에서 나머지를 구하는 방법은 다른 프로그래밍 언어와 마찬가지로

% 연산을 통해서 구해주시면 됩니다.

 

다만, 기본 % 연산은 정수끼리의 나누기에서의 나머지만을 지원하며,

 

실수 자료형이 포함된 경우에서 나머지를 구하려면

C언어의 경우는 math.h 라이브러리의 fmod 등의 함수를

C++의 경우는 cmath 라이브러리의 std::fmod 등의 함수를 사용해주셔야 합니다.

(참고 : double 자료형 -> fmod, float 자료형 -> fmodf, long double 자료형 -> fmodl)

#include <stdio.h>
#include <math.h>

int main(){

// 정수끼리의 나머지 연산
int a = 5 % 2;
int b = 5 % -2;

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

// 실수 자료형이 포함된 나머지 연산
float c = fmodf(0.5, 0.2);
double d = fmod(0.5, 0.2);
long double e = fmodl(0.5, 0.2);

printf("%.1f\n", c); // 0.1
printf("%.1f\n", d); // 0.1
printf("%.1Lf\n", e); // 0.1

}