whileループを使って分数を約分(既約分数)するCプログラムの作成方法
分数を約分するとは?
分数を約分して既約分数にするとは、分子と分母の両方を割り切れる数が「1」以外に存在しない状態にすることを指します。
例えば、24/4という分数の最も簡単な形は「6」であり、12/16という分数であれば「3/4」が既約分数となります。
それでは、whileループを使用して分数を約分するCプログラムを作成してみましょう。
例1:ユークリッドの互除法を使う方法
このプログラムでは、ユークリッドの互除法(剰余演算を繰り返して最大公約数を求める古典的手法)を用いています。まず分子と分母の値を保存し、whileループの中で余りを計算しながら最大公約数(GCD)を求めます。最後に、その最大公約数で分子と分母を割ることで約分を実現しています。また、分母に0が入力された場合にはエラーメッセージを表示する処理も組み込んでいます。
#include<stdio.h>
int main(){
int x,y,mod=1,numerat,denomi,lessnumert,lessdenomi;
printf("分数を「分子/分母」の形式で入力してください:");
scanf("%d/%d", &x,&y);
numerat=x;
denomi=y;
switch(y){
case 0:printf("分母に0は指定できません\n");
break;
}
while(mod!=0){
mod= x % y;
x=y;
y=mod;
}
lessnumert= numerat/x;
lessdenomi=denomi/x;
printf("分数の最も簡単な形:%d/%d\n",lessnumert,lessdenomi);
return 0;
}
実行結果
分数を「分子/分母」の形式で入力してください:12/24 分数の最も簡単な形:1/2
※ ループ条件で使う変数modは、初期化せずに宣言すると未定義動作になる可能性があるため、あらかじめ0以外の値で初期化しておくのが安全です。
例2:小さい方の値から順に調べる方法
こちらのプログラムでは、分子と分母のうち小さい方の値を候補として設定し、whileループで1ずつ減らしながら「両方を割り切れる数(=最大公約数)」を探します。分子または分母が0の場合は、特別に「0」または「無限大」として表示する処理を加えています。
//分数を約分するプログラム
#include <stdio.h>
int main() {
int num1, num2, GCD;
printf("num1 /num2 の形式で値を入力してください:");
scanf("%d/%d", &num1, &num2);
if (num1 < num2){
GCD = num1;
} else {
GCD = num2;
}
if (num1 == 0 || num2 == 0){
printf("簡略化された分数は %s です\n", num1?"無限大":"0");
}
while (GCD > 1) {
if (num1 % GCD == 0 && num2 % GCD == 0)
break;
GCD--;
}
printf("最終的な分数 %d/%d\n", num1 / GCD, num2 / GCD);
return 0;
}
実行結果
num1 /num2 の形式で値を入力してください:28/32 最終的な分数 7/8
まとめ
どちらの方法でも、whileループを使って最大公約数(GCD)を求め、それで分子と分母を割ることで、分数をこれ以上簡略化できない既約分数にすることができます。特に例1のユークリッドの互除法は計算回数が少なく効率的なため、大きな数値を扱う場合にも適したアプローチです。一方、例2の方法はロジックが直感的で理解しやすい反面、数値が大きくなるとループ回数が増える点に注意が必要です。
-
【Python】ループを使わずに数列を出力する方法:再帰呼び出しを活用した実装
はじめに 本記事では、以下の問題に対する解決策について詳しく解説します。 問題の概要 2つの整数 N と K が与えられたとき、N が 0 より大きい間は N から K を引き続けます。そして N が 0 以下になったら、今度は元の値 N に戻るまで K を足していきます。 入力例 N = 10 K = 4 出力例 10 6 2 -2 2 6 10 アルゴリズムの考え方 N が 0 より大きい間、関数を再帰的に呼び出し続けます(各呼び出しごとに N から K を減算します)。 数値が 0 以下になったら、元の値に戻るまで各呼び出しごとに K を加算します。 加算と減算は同じ1つの関数
-
ループを使わずに数列を出力するPythonプログラム|再帰とフラグで実現する方法
本記事では、for文やwhile文などのループ構文を一切使わずに数列を表示するという問題の解法について解説します。問題の定義問題: 2つの数値 N と K が与えられます。まずNが0より大きい間はNからKを繰り返し引き、Nが0以下(ゼロまたは負)になったら、今度は逆にKを足していきます。そして値が元の数値Nに戻った時点で処理を終了します。実行例N = 10K = 4出力: 10 6 2 -2 2 6 10アルゴリズムNが0より大きい間、関数を再帰的に呼び出し続けます。各呼び出しのたびにNからKを減算します。数値が0以下になったら加算モードに切り替え、各呼び出しごとにKを加算します。元の数値Nに