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
処理のポイント
このプログラムの流れを整理すると、以下のようになります。
- GCDの計算: 再帰的にユークリッドの互除法を用いて、2つの分母の最大公約数を求めます。
- 通分: 「LCM × GCD = 分母1 × 分母2」の関係を利用して最小公倍数を算出し、共通の分母を作ります。
- 分子の計算: 各分子に(共通分母 ÷ 元の分母)を掛けてから加算します。
- 約分: 最終的な分子と分母の最大公約数で割ることで、最も簡単な形の分数にします。
なお、このコードは参照渡し(&)を使用しているため、厳密にはC++の構文です。純粋なC言語で記述する場合は、ポインタ渡しに置き換えることで同様の動作を実現できます。
-
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を足した場合は、その桁
-
Pythonで2つの数値を加算するプログラム:ビット演算による実装方法
この記事では、2つの数値を加算するという問題に対する解法とアプローチについて詳しく解説します。 問題の概要 2つの大きな数値が与えられ、それらを加算した結果を出力することが求められます。 最も単純なアプローチは、オペランド同士を「+」演算子で結ぶ方法です。また、2つの数値をリストなどのイテラブルに格納し、Python標準ライブラリに用意されている組み込み関数 sum() を利用する方法もあります。 しかし、これらのアプローチでは10進数に対して直接演算を行うため、計算コストが増大するという課題があります。 ビット演算を用いた別のアプローチ そこで次に、数値をビット単位で操作する別のアプローチを