어떤 수 n을 m으로 나누었을 때 몫이 q이고 나머지가 r이면
n = m*q + r이다.
따라서 어떤 수를 나누었을 때 몫과 나머지는 위의 식만 지키면 된다.
7을 3으로 나누면 2.3333...... 이 된다.
C언어의 경우 이 소수점 뒤의 수를 '버림'을 하여 2가 되고 Python의 경우 '내림'을 해서 2를 만든다. 식은 다음과 같다.
7 = 3*2 + 1
양의 나눗셈을 할 때는 몫이 둘 다 2로 같은 반면, 음수 나눗셈을 하면 두 언어는 다른 몫을 도출해낸다.
7을 -3으로 나누면 -2.3333...... 이 된다.
C언어의 경우 이 소수점 뒤의 수를 '버림'을 하므로 몫은 -2가 된다. 이를 식으로 표현하면 다음과 같다.
7 = -3*-2 - 1
Python의 경우 -2.3333...... 을 '내림'을 하므로 -2.3333...... 보다 작은 정수 -3이 몫이 된다. 이를 식으로 표현하면 다음과 같다.
7 = -3*-3 + 1
파이썬과 같이 내림을 하는 경우 프로그래밍을 할 때 좀 더 좋은 환경을 제공해준다.
이를테면, 오늘이 화요일인데 N일 전은 무슨 요일인지 구하는 코드를 작성할 때 파이썬은 다음과 같이 작성하면 되지만
return (2 - N) % 7
C와 같이 버림을 하는 언어를 사용할 경우 위와 똑같이 작성하면 N이 3 이상일 때 리턴 값이 음수가 나온다.
따라서 우리가 원하는 수가 나오게 하려면 다음과 같이 작성해야 한다.
int result = (2 - N) % 7;
return result < 0 ? result + 7 : result;
또 다른 예시로, 00:00:00부터 t만큼 시간이 지났을 때 하루 중 몇 초를 지나고 있는지를 구하려면 하루는 60(초) *60(분) * 24(시간) = 86400초 이므로 t % 86400이다.
하지만 우리가 C언어와 같이 '버림'을 선택한다면 t가 음수일 때 무의미한 수를 출력한다.
* t가 -1일 때 파이썬은 t % 86400 == 86399로 정상적인 결과를 나타내지만 C는 t % 86400 == -1이 된다.
t가 주어질 때 하루 중 몇 초인지 구하려고 86400으로 나눈 것인데 -1 나오므로 또 추가적인 계산을 해야 한다.
https://foxtrotin.tistory.com/97
https://stackoverflow.com/questions/3883004/the-modulo-operation-on-negative-numbers-in-python
http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html
'프로그래밍 기초' 카테고리의 다른 글
3의 배수 판별법 (0) | 2022.07.01 |
---|---|
최대공약수, 최소공배수, 유클리드 호제법 (0) | 2022.07.01 |
동적 배열 (0) | 2022.05.29 |
32bit vs 64bit (0) | 2021.10.06 |
Java에서 String 생성 시 ""와 new 의 차이 (0) | 2021.09.09 |