このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/194
#  [1] 授業単元:C言語入門  
#  [2] 問題文: http://ime.nu/codepad.org/hsA7qgRQ  
#  課題3
#  
#  キーボードからintの整数を入力する.入力された整数と,整数9699690との最大公約数を表示するプログラムを作成せよ.ただし整数9699690よりも大きい数が入力された場合はerrorと表示すること.マイナスの数を入力された場合は正の数として計算すること.
#  また,次の関数プロトタイプにしたがう自作の関数gcdを使うようにプログラムすること
#  
#  int gcd(int m, int x);    //m>xとしてmとxの最大公約数を求めて返す関数
#  このgcdを使うとmain関数は次のようにできる.
#  
#   int main(void)
#   {
#      int m,n,g;
#      m=9699690;
#      scanf("%d", &n);
#      g = gcd( m, n);
#      printf("%d\n",g);
#   }
#  関数gcdの本体定義部分を自分で追加して全体としてプログラムを完成させること.
#  
#  実行例
#  実行開始
#  60         ←キーボードから60と入力
#  30	   ←9699690との最大公約数30を表示
#  					   
#  ヒント
#  最大公約数を求める有名なアルゴリズムとして,ユークリッドの互除法がある.二つの整数a,b(a>bとする)の最大公約数dを求める. 
#  
#  ?Step 1. もしb=0であればd=|a|として終了
#  ?Step 2. aをbで割った余りをrとする
#  ?Step 3. a=b, b=rとして、Step 1.へ
#  
#  
#  

'キーボードからintの整数を入力する.入力された整数と,整数9699690との最大公約数を表示する' :-
        整数を入力する(_整数),
        最大公約数をユークリッドの互除法で求める(9699690,_整数,_最大公約数),
        writef('最大公約数は %t です\n',[_最大公約数]).

整数を入力する(_整数) :-
        write('整数を入力して下さい : ),
        get_line(Line),
        整数を入力する(Line,_整数),!.
整数を入力する(_整数) :-
        整数を入力する(_整数).

整数を入力する(Line,_整数) :-
        atom_to_term(Line,_整数_1,_),
        integer(_整数),
        整数入力検査(_整数_1,_整数),!.
整数を入力する(Line,_) :-
        writef('入力された %t からは適切な整数が得られません。再入力をお願いします\n',[Line]),
        fail.

整数入力検査(_整数_1,_整数) :-
        9699690 > _整数_1,
        write('error\n'),!,
        fail.
整数入力検査(_整数_1,_整数) :-
        _整数_1 < 0,
        _整数 is abs(_整数_1),!.
整数入力検査(_整数,_整数) :-
        _整数 > 0,!.

最大公約数をユークリッドの互除法で求める(M,N,N) :-
        0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
        Mod is M mod N,
        最大公約数をユークリッドの互除法で求める(N,Mod,X).