C 言語で階乗を計算する方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、C プログラミングで階乗を計算する方法を学びます。この実験では、数値の階乗を計算するための 2 つの方法、反復ループと再帰関数を使用します。まず、ユーザーから整数を入力を読み取り、ループベースと再帰の両方のアプローチを使用して階乗を計算し、最後に結果を出力します。

この実験では、階乗計算の C プログラミングにおける包括的な理解を確実にするために、段階的な手順とコード例を提供します。

整数 n の入力

このステップでは、C プログラムで数値の階乗を計算するために、整数入力をどのように読み取るのかを学びます。ここでは、ユーザーに数値の入力を求め、その値を後続の計算のために保存するシンプルなプログラムを作成することに焦点を当てます。

まず、プロジェクトディレクトリに新しい C ファイルを作成しましょう。

cd ~/project
nano factorial.c

次に、整数入力を読み取るための以下のコードを追加します。

#include <stdio.h>

int main() {
    int n;

    printf("階乗を計算する数値を入力してください:");
    scanf("%d", &n);

    printf("入力された値は:%d\n", n);

    return 0;
}

プログラムをコンパイルして実行してみましょう。

gcc factorial.c -o factorial
./factorial

実行例:

階乗を計算する数値を入力してください: 5
入力された値は: 5

このコードでは:

  • printf() はユーザーへのプロンプトを表示するために使用されます。
  • scanf() はユーザーからの整数入力を読み取ります。
  • %d は整数の書式指定子です。
  • &n は入力値を格納するために変数 n のメモリアドレスを渡します。

ループまたは再帰を用いた n! の計算

このステップでは、反復ループと再帰関数を用いた 2 つの方法で数値の階乗を計算する方法を学びます。前の factorial.c ファイルを修正して、両方のアプローチを実装します。

factorial.c ファイルを更新しましょう。

cd ~/project
nano factorial.c

ループと再帰を用いた階乗計算を実装するための以下のコードを追加します。

#include <stdio.h>

// 反復ループを用いた階乗計算
unsigned long long factorialLoop(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

// 再帰を用いた階乗計算
unsigned long long factorialRecursive(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorialRecursive(n - 1);
}

int main() {
    int n;

    printf("階乗を計算する数値を入力してください:");
    scanf("%d", &n);

    if (n < 0) {
        printf("負の数の階乗は定義されていません。\n");
        return 1;
    }

    printf("ループを用いた階乗:%llu\n", factorialLoop(n));
    printf("再帰を用いた階乗:%llu\n", factorialRecursive(n));

    return 0;
}

プログラムをコンパイルして実行します。

gcc factorial.c -o factorial
./factorial

実行例:

階乗を計算する数値を入力してください: 5
ループを用いた階乗: 120
再帰を用いた階乗: 120

実装上のポイント:

  • より大きな階乗値を扱うために unsigned long long を使用しています。
  • ループ方法は、for ループを使用して数値を乗算します。
  • 再帰方法は、基本ケースに到達するまで自身を n-1 で呼び出します。
  • 負の数のエラー処理が追加されています。
  • 両方の方法で同じ結果が得られます。

階乗の出力

このステップでは、階乗計算プログラムを拡張して、より詳細な出力を行い、さまざまな入力状況に対応できるようにします。factorial.c ファイルを修正して、階乗結果の表示を改善します。

factorial.c ファイルを更新します。

cd ~/project
nano factorial.c

以前の内容を以下の改良版に置き換えます。

#include <stdio.h>

unsigned long long factorialLoop(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

void printFactorialDetails(int n, unsigned long long factorial) {
    printf("階乗計算詳細:\n");
    printf("数値 (n): %d\n", n);
    printf("階乗 (n!): %llu\n", factorial);

    printf("階乗展開:");
    for (int i = 1; i <= n; i++) {
        printf("%d%s", i, (i < n) ? " × " : " = ");
    }
    printf("%llu\n", factorial);
}

int main() {
    int n;

    printf("階乗を計算する非負の整数を入力してください:");
    scanf("%d", &n);

    if (n < 0) {
        printf("エラー: 負の数の階乗は定義されていません。\n");
        return 1;
    }

    if (n > 20) {
        printf("警告:大きな数値の階乗は、整数オーバーフローを引き起こす可能性があります。\n");
    }

    unsigned long long result = factorialLoop(n);
    printFactorialDetails(n, result);

    return 0;
}

プログラムをコンパイルして実行します。

gcc factorial.c -o factorial
./factorial

実行例:

階乗を計算する非負の整数を入力してください: 5
階乗計算詳細:
数値 (n): 5
階乗 (n!): 120
階乗展開: 1 × 2 × 3 × 4 × 5 = 120

今回のバージョンで改善された点:

  • 詳細な printFactorialDetails() 関数を追加しました。
  • 階乗の完全な展開を表示します。
  • 大きな数値の場合の警告を含めました。
  • 明確で情報量の多い出力を提供します。

まとめ

この実験では、ユーザーから整数を入力を受け取り、反復ループと再帰関数の両方を使用してその階乗を計算する方法を学びました。ユーザーに数値を求め、負の入力値を処理し、階乗結果を出力する C プログラムの作成プロセスを探索しました。この実験では、ユーザー入力の読み取り、階乗計算アルゴリズムの実装、最終結果の出力という主要な手順を網羅しました。