사칙연산과 나머지: 정수 나눗셈의 함정
공식
사칙연산 한눈에
| 연산 | 기호 | 예 (7과 3) |
|---|---|---|
| 덧셈 | + |
10 |
| 뺄셈 | - |
4 |
| 곱셈 | * |
21 |
| 나눗셈 | / |
C++: 2, 파이썬: 2.333... |
| 나머지 | % |
1 |
1. 정수 나눗셈 vs 실수 나눗셈
이게 초심자가 가장 많이 틀리는 부분입니다.
cout << 7 / 3 << '\n'; // 2 (정수끼리면 소수점 버림)
cout << 7.0 / 3 << '\n'; // 2.3333...
cout << (double)7 / 3 << '\n'; // 2.3333...
print(7 / 3) # 2.3333... (/는 항상 실수)
print(7 // 3) # 2 (//가 정수 나눗셈)
C++의 /는 양쪽이 정수면 소수점을 버립니다. 실수 결과가 필요하면 한쪽을
double로 만드세요. 파이썬은 반대로 /가 실수, //가 정수 나눗셈입니다.
2. 나머지 연산 %
a % b는 a를 b로 나눈 나머지입니다. 활용도가 아주 높습니다.
if (n % 2 == 0) cout << "짝수\n";
else cout << "홀수\n";
- 마지막 자리 숫자:
n % 10 - 어떤 수로 나누어떨어지는지:
n % k == 0 - 시계처럼 한 바퀴 돌리기:
(i + 1) % n
3. 음수의 나눗셈 / 나머지
언어마다 음수 처리가 다릅니다.
cout << (-7) / 2 << '\n'; // -3 (0 방향으로 버림)
cout << (-7) % 2 << '\n'; // -1
print(-7 // 2) # -4 (음의 무한대 방향으로 내림)
print(-7 % 2) # 1 (결과 부호가 나누는 수를 따라감)
음수가 섞인 나머지를 쓸 땐 부호 규칙을 꼭 확인하세요. 항상 0 이상인 나머지가
필요하면 ((a % b) + b) % b 패턴을 씁니다.
4. 오버플로 주의
int a = 100000, b = 100000;
cout << a * b << '\n'; // 잘못! int 범위(약 21억) 초과
cout << (long long)a * b << '\n'; // 10^10 — 올바름
곱셈은 순식간에 int를 넘깁니다. 결과가 클 것 같으면 long long을 쓰거나
곱하기 전에 한쪽을 (long long)으로 형변환하세요. ([변수와 자료형] 참고)
5. 자주 하는 실수
- 정수 나눗셈으로 평균이 잘림 —
(a + b) / 2가 소수점을 버립니다. - 0으로 나누기 —
b가 0일 수 있는 입력에서a / b,a % b는 런타임 에러(예외)입니다. - 연산 우선순위 —
a + b * c는 곱셈 먼저. 의도한 순서면 괄호로(a + b) * c처럼 명확히 하세요.
연습 팁
나눗셈을 쓸 때마다 "정수로 잘려야 하나, 실수로 남아야 하나?"를 한 번
멈춰서 확인하는 습관을 들이면 사칙연산에서 나오는 실수의 절반은 사라집니다.