프로그래밍 기초

음수 나머지 연산

hs-archive 2022. 6. 30. 15:26

어떤 수 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

 

음수를 나머지 연산하려면 어떻게 해야 할까?

음수를 나머지 연산하려면 어떻게 해야 할까요? 질문에 앞에 먼저 음수 나눗셈을 해봅시다. 10/-2를 한다고 했을 때, 10/-2는 ‘-2를 몇 번 더해야(빼야) 10이 나올까?’와 같은 의미입니다. 10은 -(-2

foxtrotin.tistory.com

https://stackoverflow.com/questions/3883004/the-modulo-operation-on-negative-numbers-in-python

 

The modulo operation on negative numbers in Python

I've found some strange behaviour in Python regarding negative numbers: >>> -5 % 4 3 Could anyone explain what's going on?

stackoverflow.com

http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html

 

Why Python's Integer Division Floors

I was asked (again) today to explain why integer division in Python returns the floor of the result instead of truncating towards zero like...

python-history.blogspot.com

'프로그래밍 기초' 카테고리의 다른 글

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