C 언어 기초
int fact(int n) {
if (n <= 1)
return 1;
return n * fact(n - 1);
}int는 32비트(최댓값 2147483647)로 한다. 위의 함수 fact(n)이 n의 계승을 오버플로 없이 올바르게 반환하는 최대의 n은?
- A12
- B13
- C20
정답과 해설 보기
정답: A. 12
fact는 n × fact(n − 1)처럼 자기 자신을 호출하고, n이 1 이하가 되면 1을 반환하는 재귀 함수입니다. 12! = 479001600은 int의 최댓값 2147483647보다 작으므로 올바르게 구해지지만, 13! = 6227020800은 최댓값을 넘습니다. fact(13)에서는 마지막 13 × 479001600의 곱셈에서 부호 있는 정수의 오버플로가 일어나며, 이는 미정의 동작입니다. 예를 들어 최적화를 하지 않는 x86-64의 gcc에서는 6227020800을 2³²로 나눈 나머지인 1932053504가 반환되지만, 이 결과는 보장되지 않습니다. 더 큰 n에는 64비트 long long(n = 20까지) 등을 사용합니다.