C 言語による分数の簡約化 (最大公約数)

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

はじめに

この実験では、C プログラミングで最大公約数 (GCD) アルゴリズムを使用して分数簡約化する方法を学びます。この実験では、以下の手順をカバーします:ユーザー入力から分子と分母を読み取る、GCD を計算する、そして GCD で分子と分母を割って簡約化された分数を得る。この実験は、分数の簡約化の概念を理解し、C プログラミング技術を使用して実装するのに役立ちます。

分子と分母の入力

このステップでは、分数の簡約化を行う C プログラムで、ユーザー入力から分子と分母を読み取る方法を学びます。

まず、分数の簡約化プログラム用の新しい C ファイルを作成しましょう。

cd ~/project
nano fraction_simplify.c

次に、分子と分母を読み取るための以下のコードを追加します。

#include <stdio.h>

int main() {
    int numerator, denominator;

    printf("分子を入力してください:");
    scanf("%d", &numerator);

    printf("分母を入力してください:");
    scanf("%d", &denominator);

    printf("分子:%d\n", numerator);
    printf("分母:%d\n", denominator);

    return 0;
}

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

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

実行例:

分子を入力してください: 12
分母を入力してください: 18
分子: 12
分母: 18

コードの説明:

  • scanf() は、ユーザーから整数を入力を読み取るために使用されます。
  • %d は整数の書式指定子です。
  • &numerator&denominator は、入力値を格納するためのメモリアドレスを渡します。
  • printf() は、入力された分子と分母を表示するために使用されます。

GCD の計算と両方の値の除算

このステップでは、最大公約数 (GCD) アルゴリズムを実装し、それを用いて分数を簡約化します。

前のプログラムを修正して GCD 計算関数を追加しましょう。

cd ~/project
nano fraction_simplify.c

以下の実装でコードを更新します。

#include <stdio.h>

// ユークリッドの互除法を用いた GCD の計算関数
int computeGCD(int a, int b) {
    // 正の値にする
    a = (a > 0) ? a : -a;
    b = (b > 0) ? b : -b;

    // ユークリッドの互除法
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

int main() {
    int numerator, denominator, gcd;

    printf("分子を入力してください:");
    scanf("%d", &numerator);

    printf("分母を入力してください:");
    scanf("%d", &denominator);

    // GCD を計算する
    gcd = computeGCD(numerator, denominator);

    // 分数を簡約化する
    int simplified_numerator = numerator / gcd;
    int simplified_denominator = denominator / gcd;

    printf("元の分数:%d/%d\n", numerator, denominator);
    printf("簡約化された分数:%d/%d\n", simplified_numerator, simplified_denominator);

    return 0;
}

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

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

実行例:

分子を入力してください: 12
分母を入力してください: 18
元の分数: 12/18
簡約化された分数: 2/3

コードの説明:

  • computeGCD() は、ユークリッドの互除法を使用して最大公約数を求めます。
  • この関数は正の数と負の数を処理します。
  • 分数はその GCD で分子と分母を割ることで簡約化されます。
  • ゼロや負の数などの特殊なケースも処理します。

簡約化された分数の表示

このステップでは、分数の簡約化プログラムを強化し、様々な入力状況に対応し、出力形式を明確にします。

プログラムを更新して、より堅牢な分数の表示機能を追加しましょう。

cd ~/project
nano fraction_simplify.c

以下の実装でコードを更新します。

#include <stdio.h>

// ユークリッドの互除法を用いた GCD の計算関数
int computeGCD(int a, int b) {
    a = (a > 0) ? a : -a;
    b = (b > 0) ? b : -b;

    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

// 分数を表示する関数(特殊ケース処理付き)
void printFraction(int numerator, int denominator) {
    // ゼロ除算の処理
    if (denominator == 0) {
        printf("エラー: ゼロ除算は許可されていません。\n");
        return;
    }

    // GCD を計算する
    int gcd = computeGCD(numerator, denominator);

    // 分数を簡約化する
    int simplified_numerator = numerator / gcd;
    int simplified_denominator = denominator / gcd;

    // 符号の処理
    if (simplified_denominator < 0) {
        simplified_numerator = -simplified_numerator;
        simplified_denominator = -simplified_denominator;
    }

    // 結果を表示する
    printf("元の分数:%d/%d\n", numerator, denominator);

    // 整数と分数の異なる出力
    if (simplified_denominator == 1) {
        printf("簡約化された分数:%d\n", simplified_numerator);
    } else {
        printf("簡約化された分数:%d/%d\n",
               simplified_numerator, simplified_denominator);
    }
}

int main() {
    int numerator, denominator;

    printf("分子を入力してください:");
    scanf("%d", &numerator);

    printf("分母を入力してください:");
    scanf("%d", &denominator);

    // 分数表示関数を呼び出す
    printFraction(numerator, denominator);

    return 0;
}

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

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

実行例:

分子を入力してください: 12
分母を入力してください: 18
元の分数: 12/18
簡約化された分数: 2/3

分子を入力してください: 15
分母を入力してください: 5
元の分数: 15/5
簡約化された分数: 3

分子を入力してください: -12
分母を入力してください: 18
元の分数: -12/18
簡約化された分数: -2/3

コードの説明:

  • 分数表示を処理する printFraction() 関数を追加しました。
  • ゼロ除算などの特殊なケースを処理します。
  • 簡約化された分数の符号を管理します。
  • 分母が 1 の場合、整数として表示します。
  • 分数の元の符号を保持します。

まとめ

この実験では、ユーザー入力から分子と分母を読み取り、ユークリッドの互除法を用いて最大公約数 (GCD) を計算し、分子と分母を GCD で割ることで分数を簡約化する方法を学びます。簡約化された分数が出力として表示されます。

主な手順は次のとおりです。1) ユーザー入力から分子と分母を読み取る、2) 最大公約数を求める GCD アルゴリズムを実装する、3) GCD で分子と分母を割って簡約化された分数を得る。