ちぇりーの館

1−12 C言語プログラミング講座 色々なプログラムを作ってみよう 〜最大公約数を求めるプログラム〜



こんにちは! 今回は、今までの復習をかねて最大公約数を求めるプログラムを作ってみます。 考え方は少し複雑かもしれませんが、プログラム自体は単純なのでじっくりと読んでいただければ 分ると思います。

【最大公約数を求める】

 皆さんは、最大公約数とは何かを覚えているでしょうか。簡単に言うと、2つの数字に共通する 割り切れる最大の数字の事です。正直、学生時代以外ではほとんど使う事がない知識の一つですが、 今回はこれを求めるプログラムを作ってみます。それでは、まず最大公約数の求め方を考えてみましょう。 皆さんは学生の頃は、どのように求めていましたか? 私は、以下のような感じで問題を解いていました。

例)  80と32の最大公約数を求める場合。

  @とりあえず、8で割れそうなので両方を8で割る。
       80÷8 = 10    32÷8=4
  Aとりあえず、2でわれそうなので両方を2で割る。
       10÷2 = 5     4÷2 = 2
  Bこれ以上割れないので、@とAで割った値を掛けた結果が答えとなる。
       8×2 = 16

こんな感じです。しかし、この方法をプログラムで書こうとすると大きな問題にあたります。 それは、"とりあえずなんで割ったらいいのか?"という事です。 人間なら経験から"こんな感じの数字なら割れる!"ができるので、ある程度あたりをつけて割り算を 行えますが、コンピューターの場合『あたりをつけて』という事ができません。これは、困った……。

【ユークリッドの互助算】

 上記の方法ではコンピュータ君はなかなか難しいので、通常は、ユークリッドの互助算と呼ばれる方法を使用します。 この方法は、以下の考え方に基づいています。

『2つの整数m,n(m > n)があった時、mとnの最大公約数は、m−nとnの最大公約数を求める方法に置き換える事ができる』

なにを言ってるのか良くわからないので、具体的な数字を使って見ていきましょう。
二つの整数80と32の最大公約数を求めます。80の方が数が大きいので、m=80、n=32とします。

@ mとnを比較し、大きい値m(80)から小さい値n(32)を引きます。
  m = 80 - 32 = 48
  n = 32

A mとnを比較し、大きい値m(48)から小さい値n(32)を引きます。
  m = 48 - 32 = 16
  n = 32

B mとnを比較し、大きい値n(32)から小さい値m(16)を引きます。
  m = 16
  n = 32 - 16

C mとnを比較し、値が一致したのでこの値(16)が最大公約数となります。

どうでしょか。簡単に言うと、大きな値から小さい値を引く事を繰り返す事によって最終的に一致する値が 最大公約数となります。もう少し、プログラム的に考えると以下のようになります。

  1. 整数型の変数mとnを用意する。
  2. mとnに値をセットする。
  3. 以下@〜Bを繰り返します。繰り返す回数は、未定なのでwhile文を使用する。
   @ m > nの時、 m = m - nを行う。
   A m < nの時、 n = n - mを行う。
   B m = nの時、while文を終了する。
  4. mとnの値が最大公約数となる。

どうでしょうか。それでは、実際にプログラムを書いて見ましょう。

#include <stdio.h>
#include <stdlib.h>

/***********************************/
/*   ユークリッドの互助算    */
/***********************************/
int main()
{
	int m,n;

	m = 80;
	n = 32;

	printf("%dと%dの最大公約数は ----->", m , n);
	while(-1)
	{
		if(   m > n)     m = m - n;
		else if( m < n)  n = n - m;
		else		     break;	//m=nの時
	}
	printf("%dです。", m);

	scanf("a");
	return 0;
}

whileループに終了条件を-1としていますが、これは常に条件を満たさないため、無限ループになります。 そのため、実際のループ終了は、break文が実行された時に行われます。このbreak文は、mがnより 小さい時以外でかつ、mがnよりも大きい時以外となり、つまりmとnが等しい時に実行されます。

最大公約数の結果


 今回は、ここまでとなります。今回のプログラムを組む上でもっとも重要な事は、コンピュータ上では、 『経験』のようなあいまいな考えは、使えない事です。そのため、面倒でもユークリッドの互助算のような 誰でも計算が行える方法で処理を書かなければなりません。そして、誰でも計算が行える方法とは つまり、数学の法則となります。この辺が数学とプログラミングの切っても切れない関係になります。 ただし、数学を知っているとプログラミングを行う上で有利にはなりますが、数学=プログラミングでないのも 事実です。まずは、プログラミングに慣れて、必要と感じたら数学を勉強する(調べる)ような感じで 進めていっても問題はないと思っています。要は、楽しんでプログラミングを行える事が重要ですね☆
 所で、次回も、何かのプログラムを組んでみようと思いますので、楽しみにしていてください。 毎回の事ですが、疑問・質問等がありましたら時間の許す限りお答えしようと思いますのでどしどしメールを 送ってください。でわでわ、お疲れ様でした (^_^)/

< 一覧ページへ戻る


当サイトが面白いと感じた方は、お手数ですが下記リンクをクリックしてください。
クリック毎に当ホームページの評価が上がります。ご協力お願いします!
inserted by FC2 system