第17講 ユークリッド互除法
第4話 ユークリッド互除法プログラム解説
プログラム再掲
#include<iostream>
using namespace std;
int yg(int a,int b);
void k(int a,int b);
void main(){
   int a,b;
   cout<<"aを入力して下さい。"<<endl;
   scanf("%d",&a);
   cout<<"bを入力して下さい。"<<endl;
   scanf("%d",&b);
   if(a<b)k(a,b); //aの方が小さい場合aとbを交換
   cout<<"最大公約数は"<<yg(a,b)<<"です。"<<endl;
   cout<<"プロジェクト終了"<<endl;
}
void k(int a,int b){
   int w;
   w=a;
   a=b;
   b=w;
}
int yg(int a,int b){
   a=a%b;
   if(a==0)return(b);
   yg(b,a);
}

解説

まず、if(a<b)k(a,b);においてはa方が小さい場合k(a,b)が実行されます。
関数k
void k(int a,int b){
   int w;
   w=a;
   a=b;
   b=w;
}

では、aとbを交換しています。
大きい方を小さい方で割っていくのがユークリッド互除法です。
関数ykではaをbで割っていますので、
aの方が小さい場合は、交換して交換しておかなければなりません。

交換は一回だけで済みます。
理由は、
int yg(int a,int b){
   a=a%b;
   if(a==0)return(b);
   yg(b,a);
}
a=a%bにあります。
aをbで割った余りは、bより小さいので、
yg(b,a)の
()内の前者の方が小さくなることはありません。

また、
   if(a==0)return(b);
   yg(b,a);

を見ればお分かりのように、遡及(入れ子式人形のより中への旅)は、
余りが0になるまで続けられます。
余りが0になったとき初めてreturn(b);で値を返します。
つまり、一番小さい人形が値bを返し、
中から2番目以降の人形は、その値(=一番小さい人形が返した値)を返し続けます。
結果的には、
void main()において、
cout<<"最大公約数は"<<yg(a,b)<<"です。"<<endl;
で一番中の人形が返したbの値が表示されます。
int yg(int a,int b){
   a=a%b;
   if(a==0)return(b);
   yg(b,a);
}

によって、
互い違いに割っていくユークリッド互除法が実現されていることが分かります。

第5話の課題は、ランダムに0より大きい整数aとbを発生させ、
分数a/bをつくり、その整数がユークリッド互除法を使い、
約分できるかを判定し、約分できる場合には約分し、
約分できない場合は、約分できないと表示するプログラムを考えて下さい。
r
t
ヒント:約分できるかどうかは、最大公約数が1より大きいかどうかで判定できます。
* aとbの最大公約数が1のとき、aとbは互いに素といいます。

第3話へ
 第5話へ

a

eclipse c++ 入門講義第1部へ

魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ