このディレクトリの索引
t598#最大公約数
このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1247438792/743
#  [1] 授業単元:プログラミング基礎 
#  [2] 問題文(含コード&リンク): 
#  2つの整数をキーボードから入力し、それらの最大公約数を表示する
# プログラムを作成せよ。 
#  最大公約数と、2つの数字を割り切る最大の整数のことである。 
#  例えば12と18の最大公約数は6,24と48の最大公約数は24である。 

t598 :-
    write('2数の最大公約数を求めます。カンマ区切りで二つの整数を入力してください : '),
    get_Line(Line),
    split(Line,[','],[N1,N2]),
    appendを使って最大公約数を求める(N1,N2,X),
    write_formatted('%tと%tの最大公約数は%tです\n',[N1,N2,X]).

appendを使って最大公約数を求める(N1,N2,X) :-
    length(L1,N1),
    length(L2,N2),
    appendを使って最大公約数を求める(L1,L2,[_],[_],LX),
    length(LX,X).

appendを使って最大公約数を求める(L1,L2,L,X,X) :-
    not((append(L,_,L1),append(L,_,L2))),!.
appendを使って最大公約数を求める(L1,L2,L,_,X) :-
    割り切れる(L1,L),
    割り切れる(L2,L),
    appendを使って最大公約数を求める(L1,L2,[_|L],L,X).
appendを使って最大公約数を求める(L1,L2,L,Y,X) :-
    appendを使って最大公約数を求める(L1,L2,[_|L],Y,X).

割り切れる([],_) :- !.
割り切れる(L,DL) :-
    append(DL,L3,L),
    割り切れる(L3,DL).