60日間全力プログラミング

プログラミング初心者が二ヶ月間でどこまでいけるかを記録したプログラミング学習ブログ

R54 0,30 最大公約数の求め方

考察
面白い、今度は最大公約数が一瞬で求められるようになった!1329と1111の最大公約数なんてコンピュータで計算したら一瞬!スーパーコンピューターとかこのようなことを大量に考えられないスピードでやっているんだろうな、コンピュータおそるべし。
再帰処理もなんか理解できてきた。単純に条件に合わないなら上に戻って再度計算みたいな感じ。
 
問題
 キーボードから入力した二つの数字の最大公約数を表示する。なお、最大公約数を求める
のに、kouyakusu()関数という再帰関数を利用する。
 二つの数xとyの最大公約数を求める手順(ユークリッドの互助方)
まず、x÷yの余りを求める。「余り≠0」なら、「x←y」「y←余り」として、「余り=0」
になるまでx÷yを繰り返す。
 
例.x=63、y=45の場合
 
  63 ÷ 45 = 1 ・・・ 18
  45 ÷ 18 = 2 ・・・  9
  18 ÷  9 = 2 ・・・  0 ⇒ (最大公約数は「9」)
 
表示例
 
--------最大公約数を求める関数-------
1つめの数字を入力してください---->63
2つめの数字を入力してください---->45
63 ÷ 45 = 1 余り  18
45 ÷ 18 = 2 余り  9
18 ÷ 2 = 9 余り  0
最大公約数9はです。
--------------------------------------
 
考え方
(1)数字1(suuji1)、数字2(suuji2)を入力する。
(2)最大公約数を求める関数(kouyakusu)に上記の数字を引数として実行し、
   戻り値(kotae)を受け取り、表示する。
  「kotae = kouyakusu(suuji1,suuji2)」
(3)最大公約数を求める関数
  ①仮引数をx、yとする。
  ②x、y、x÷yの値、余りを表示する。
  ③x÷yの余り(amari)が0だったらそのときのyを戻り値として返す。
   「return y」
  ④そうでない時、戻り値としてy→x、余り→yとして関数を再帰する。
   「return kouyakusu(y,amari)」
 
#include

int kouyakusu(int x,int y)
{

   
int amari;
    amari = x % y;
    printf(
"%5d ÷ %5d = %5d余り  %5d\n",x,y,x/y,amari);
   
if (amari ==0) {
       
return y;
    }
   
else{
       
return kouyakusu(y,amari);
    }
   
}

int main()
{
   
int suuji1,suuji2,kotae;
   
    printf(
"----------最大公約数を求める関数---------\n");
   
    printf(
"一つ目の数字を入力してください。\n");
    scanf(
"%d",&suuji1);
   
    printf(
"二つ目の数字を入力してください。\n");
    scanf(
"%d",&suuji2);
   
    kotae = kouyakusu(suuji1,suuji2);
    printf(
"最大公約数は%dです。\n",kotae);
   
    printf(
"-------------------------------\n");
   
   
return 0;
}