Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で2つの分数を加算するプログラムの書き方

この記事では、a/b と c/d という2つの分数が与えられたときに、その合計を求めるC言語プログラムを紹介します。ここで a、b、c、d は 0 以外の任意の整数値を取ることができます。

分数とは

分数は次のように表されます。

  • a / b の形式で表され、a を「分子」、b を「分母」と呼びます。
  • a と b には任意の数値を指定できますが、b(分母)は 0 以外の値である必要があります。

2つの分数の加算は a / b + c / d と表され、加算を行うためのルールとして「両者の分母が等しくなければならない」という点が挙げられます。分母が異なる場合は、まず通分して分母を揃えてから加算を行う必要があります。

計算例

入力: 1/4 + 2/12
出力: 5/12

この例では、両方の分数の分母が異なるため、GCD(最大公約数)または LCM(最小公倍数)を求めて通分します。分母 4 に 3 を掛ければ分母 12 に揃えられます。

(1 * 3) / (4 * 3) = 3 / 12
3 / 12 + 2 / 12 = 5 / 12
入力: 1/4 + 2/4
出力: 3/4

こちらの例では、両方の分数が同じ分母を持つため、そのまま直接加算できます。

アルゴリズム

関数 int gcd(int a, int b)
 Step 1→ もし a == 0 ならば、
     b を返す
 Step 2→ gcd(b%a, a) を返す

関数 void smallest(int &den3, int &n3)
 Step 1→ common_factor を gcd(n3, den3) として宣言・初期化する
 Step 2→ den3 = den3 / common_factor とする
 Step 3→ n3 = n3 / common_factor とする

関数 void add_frac(int n1, int den1, int n2, int den2, int &n3, int &den3)
 Step 1→ den3 = gcd(den1, den2) とする
 Step 2→ den3 = (den1 * den2) / den3 とする
 Step 3→ n3 = (n1) * (den3/den1) + (n2) * (den3/den2) とする
 Step 4→ 関数 smallest(den3, n3) を呼び出す

関数 int main()
 Step 1→ n1=1, den1=4, n2=2, den2=12, den3, n3 を宣言・初期化する
 Step 2→ add_frac(n1, den1, n2, den2, n3, den3) を呼び出す
 Step 3→ n1, den1, n2, den2, n3, den3 の値を出力する

サンプルコード

#include <stdio.h>
int gcd(int a, int b) {
    if (a == 0)
        return b;
    return gcd(b%a, a);
}
void smallest(int &den3, int &n3) {
    // 両項のgcdを求める
    int common_factor = gcd(n3,den3);
    den3 = den3/common_factor;
    n3 = n3/common_factor;
}
void add_frac(int n1, int den1, int n2, int den2, int &n3, int &den3) {
    // den1とden2のgcdを求める
    den3 = gcd(den1,den2);
    // LCM * GCD = a * b の関係を利用
    den3 = (den1*den2) / den3;
    // 入力値を同じ分母を持つ形に変換する
    // 最終的な分数の分子を求める
    n3 = (n1)*(den3/den1) + (n2)*(den3/den2);
    smallest(den3,n3);
}
// ドライバープログラム
int main() {
    int n1=1, den1=4, n2=2, den2=12, den3, n3;
    add_frac(n1, den1, n2, den2, n3, den3);
    printf("%d/%d + %d/%d = %d/%d\n", n1, den1, n2, den2, n3, den3);
    return 0;
}

実行結果

1/4 + 2/12 = 5/12

処理のポイント

このプログラムの流れを整理すると、以下のようになります。

  1. GCDの計算: 再帰的にユークリッドの互除法を用いて、2つの分母の最大公約数を求めます。
  2. 通分: 「LCM × GCD = 分母1 × 分母2」の関係を利用して最小公倍数を算出し、共通の分母を作ります。
  3. 分子の計算: 各分子に(共通分母 ÷ 元の分母)を掛けてから加算します。
  4. 約分: 最終的な分子と分母の最大公約数で割ることで、最も簡単な形の分数にします。

なお、このコードは参照渡し(&)を使用しているため、厳密にはC++の構文です。純粋なC言語で記述する場合は、ポインタ渡しに置き換えることで同様の動作を実現できます。

  1. C++で2つの2進数文字列を加算するプログラムの書き方

    2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁

  2. Pythonで2つの数値を加算するプログラム:ビット演算による実装方法

    この記事では、2つの数値を加算するという問題に対する解法とアプローチについて詳しく解説します。 問題の概要 2つの大きな数値が与えられ、それらを加算した結果を出力することが求められます。 最も単純なアプローチは、オペランド同士を「+」演算子で結ぶ方法です。また、2つの数値をリストなどのイテラブルに格納し、Python標準ライブラリに用意されている組み込み関数 sum() を利用する方法もあります。 しかし、これらのアプローチでは10進数に対して直接演算を行うため、計算コストが増大するという課題があります。 ビット演算を用いた別のアプローチ そこで次に、数値をビット単位で操作する別のアプローチを