C語言基礎

int fact(int n) {
    if (n <= 1)
        return 1;
    return n * fact(n - 1);
}

int 為32位元(最大值 2147483647)。上方的函式 fact(n) 能不發生溢位、正確回傳 n 的階乘的最大 n 為下列何者?

  1. A12
  2. B13
  3. 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。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. int 為4位元組,指標為8位元組。指向 int 的指標 p 的值(位址)為 0x1000 時,p + 3 的值為下列何者?
  2. int 為4位元組,指標為8位元組。執行上方程式時的輸出,下列何者正確?
  3. int 為4位元組。執行上方程式碼時的輸出,下列何者正確?
  4. 關於放入字串的 char 陣列,執行上方程式碼時的輸出,下列何者正確?
  5. 在上方的宣告之後,寫入甲「p = t;」、乙「*p = 'x';」、丙「q = t;」、丁「*q = 'x';」其中之一。會發生編譯錯誤的組合為下列何者?