第11講 ユークリッド互除法

第3話 ユークリッド互除法アプリ例


a=3600
b=3780
aとbの最大公約数は180です。

a=5
b=0
aにもbにも0より大きい値を入れて下さい。
a=256
b=384

を実現するアプリ例
#include<stdio.h>
void f(int a,int b); //aとbを交換する社員
int g(int a,int b); //ユークリッド互除法を行う社員
int main(){
  int a,b;
yarinaosi:;
  printf("a=");
  fflush(0); //pirntfを先に実行させるためのお呪い
  scanf("%d",&a);
  printf("b=");
  fflush(0); //pirntfを先に実行させるためのお呪い
  scanf("%d",&b);
  if(a==0 || b==0){
    printf("aにもbにも0より大きい値を入れて下さい。\n");
    goto yarinaosi; //goto文、yarinaosiに戻る
  }
  if(a<b)f(a,b);
  printf("aとbの最大公約数は%dです。\n",g(a,b));
  return(0);
}
void f(int a,int b){
  int w;
  w=a;
  a=b;
  b=w;
}
int g(int a,int b){
  a=a%b;
  if(a==0){
    return(b);
  }
  return(g(b,a));
}
コピペ用添付ファイル
解説
    goto yarinaosi; //goto文、yarinaosiに戻る
は注釈文にも書いてある通り、
goto文と呼ばれるものです。
BASICの頃、スパゲティプログラムの元凶といわれ、
プログラム言語では、嫌われる命令文の1つです。
ですが、私は次の原則を守れば使って良いと考えています。
原則 入り口と出口はそれぞれ1カ所のみ
もし、goto文を使わないでプログラムせよといわれれば、
#include<stdio.h>
void f(int a,int b); //aとbを交換する社員
int g(int a,int b); //ユークリッド互除法を行う社員
int main(){
  int a,b;
  for(;;){
    printf("a=");
    fflush(0); //pirntfを先に実行させるためのお呪い
    scanf("%d",&a);
    printf("b=");
    fflush(0); //pirntfを先に実行させるためのお呪い
    scanf("%d",&b);
    if(a==0 || b==0){
      printf("aにもbにも0より大きい値を入れて下さい。\n");
    }
    else{
      break;
    }
  }
  if(a<b)f(a,b);
  printf("aとbの最大公約数は%dです。\n",g(a,b));
  return(0);
}
void f(int a,int b){
  int w;
  w=a;
  a=b;
  b=w;
}
int g(int a,int b){
  a=a%b;
  if(a==0){
    return(b);
  }
  return(g(b,a));
}
コピペ用添付ファイル
等が考えられます。
  for(;;){
のように、;の前後を空欄にする使い方があります。
この場合、必ず
    if(a==0 || b==0){
      printf("aにもbにも0より大きい値を入れて下さい。\n");
    }
    else{
      break;
    }
のようにfor文を強制的に終了させるbreak;を入れないと、
永久ループになってしまいますので、
気をつけなければなりません。

解説は、第5話で行うことにして、次の課題です。

キーボードから入力するのではなく、
aとbの値をランダムに発生させて、
最大公約数を見つけるアプリに改造して下さい。
ランダムは毎回実行結果が異なるように、
srand(time(NULL));
をいれてください。これを使い際には、
#include<stdlib.h>
#include <time.h>
をインクルード(読み込む)ことを忘れないで下さい。
実行画面
a=20835
b=23562
aとbの最大公約数は9です。



第2話へ 第4話へ

a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ