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言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

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';」のどれかを書く。コンパイルエラーになるものの組み合わせはどれか。