안 쓰던 블로그
음수를 나머지 연산하려면 어떻게 해야 할까? 본문
음수를 나머지 연산하려면 어떻게 해야 할까요?
질문에 앞에 먼저 음수 나눗셈을 해봅시다. 10/-2를 한다고 했을 때, 10/-2는 ‘-2를 몇 번 더해야(빼야) 10이 나올까?’와 같은 의미입니다. 10은 -(-2) -(-2) -(-2) -(-2) -(-2) 라고 쓸 수 있는데, 횟수로는 5번이지만 -2를 더하면 안 되고 빼야 되기 때문에 10/-2는 -5입니다. 같은 의미로 10=-2*-5도 ‘10은 -2를 -5번 더한(뺀) 수다’라고 할 수 있겠네요.
그러면 이제 나머지를 구해봅시다. 7/-3의 몫은 -2입니다. 그러면 나머지는? -(-3)-(-3)을 한 뒤 남은 수는 1이니까 나머지는 1입니다. -7/-3은 어떻게 나올까요? -7을 만들기 위해서는 -3-3-3을 해야 합니다. 몫은 3이고 -9가 나왔으니까 나머지는 2가 나옵니다. 이런 계산을 어떻게 구현해야 할까요?
사실 음수 나눗셈의 의미는 양수처럼 명확히 정의되지 않아서 언어에 따라 결과가 다르게 나온다고 합니다. 예를 들어 C언어는 기본적으로 버림을 하고(5/2를 float로 2.5) 음수 나머지도 허용합니다. 그래서 -7=3*-2 – 1로 봅니다. 반면 파이썬은 기본적으로 내림을 하고(5/2를 float로 2.0) 양수 나머지만 허용합니다. 그래서 -7=3*-3 + 2로 봅니다. (참고: https://stackoverflow.com/questions/19517868/integer-division-by-negative-number) 만약 C언어로 음수 나눗셈을 구현하고자 한다면 파이썬처럼 나누고 내림차순 하는 과정을 거쳐서 나머지를 양수로 만들면 되지 않을까 생각합니다.
관련 문제- 백준 16428 A/B - 3
https://www.acmicpc.net/problem/16428
'알고리즘 > Algorithm' 카테고리의 다른 글
펜윅트리로 '세그먼트 트리 느리게 업데이트 하기(Lazy Propagation)' 구현하기(2934 LRH식물 펜윅트리) (3) | 2020.04.04 |
---|---|
단순구현 (0) | 2019.07.06 |
알고리즘-수학2 (0) | 2019.07.06 |
알고리즘-수학1 (0) | 2019.07.06 |
std::sort 정렬 기준 바꾸기 (1) | 2019.05.12 |