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 為止)等型別。
- A. 正確。12! = 479001600 小於最大值,13! 超過最大值。
- B. 13! = 6227020800 超過 int 的最大值 2147483647,因此無法正確求出。
- C. 20 是以64位元有號整數(long long 等)能正確求出的最大 n。