このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/526
#  [1] 授業単元:C言語 
#   
#  [2] 問題文(含コード&リンク): 
#   1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、 
#   その重さの合計を小数点以下1桁まで入力させる。 
#   その値から、取り出した硬貨の合計金額を推定し表示するプログラムを作れ。 
#   ただし、推定される金額が複数存在する場合はその全てを表示する。 
#   また、1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の1枚あたりの重さは 
#   それぞれ1g, 3.7g, 4.5g, 4g, 4.8g, 7gであるとする。 
#   (入力例) 
#   8.0 
#   (出力例) 
#   8円 
#   54円 
#   100円 
#   501円 
#   

'1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、その重さの合計を小数点以下1桁まで入力させる。その値から、取り出した硬貨の合計金額を推定し表示する' :-
        '重さの合計を小数点以下1桁まで入力'(_重さの合計),
        '取り出した硬貨の合計金額を推定し'(_重さの合計,_取り出した硬貨の合計金額),
        表示する(_取り出した硬貨の合計金額),
        fail.
'1円硬貨, 5円硬貨, 10円硬貨, 50円硬貨, 100円硬貨, 500円硬貨の内から種類不問で何枚か取り出し、その重さの合計を小数点以下1桁まで入力させる。その値から、取り出した硬貨の合計金額を推定し表示する'.

'重さの合計を小数点以下1桁まで入力'(_重さの合計) :-
        write('重さの合計を小数点以下1桁まで入力してください : '),
        get_line(Line),
        重さの合計入力診断(Line,_重さの合計),!.
'重さの合計を小数点以下1桁まで入力'(_重さの合計) :-
        '重さの合計を小数点以下1桁まで入力'(_重さの合計).

重さの合計入力診断(Line,_重さの合計) :-
        atom_to_term(Line,_重さの合計の一,_),
        float(_重さの合計の一),
        _重さの合計 is floor(_重さの合計の一 * 10) / 10,!.
重さの合計入力診断(Line,_重さの合計) :-
        writef('入力された%tからは適切な実数値が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

'取り出した硬貨の合計金額を推定し'(_重さの合計,_取り出した硬貨の合計金額) :-

        Max is truncate(_重さの合計),
        findall(N,for(Max,N,0),L1),
        順列(L1,6,[F,E,D,C,B,A]),
        重さの制限(_重さの合計,F,E,D,C,B,A),
        _重さの合計100mg is truncate(_重さの合計 * 10),
        _重さの合計100mg is 10 * A + 37 * B + 45 * C + 40 * D + 48 * E + 70 * F,
        _取り出した硬貨の合計金額 is 1 * A + 5 * B + 10 * C + 50 * D + 100 * E + 500 * F.

重さの制限(_重さの合計100mg,F,E,D,C,B,A) :-
        F =< _重さの合計100mg // 70,
        _重さの合計100mg_2 is _重さの合計100mg - F * 70,
        E =< _重さの合計100mg_2 // 48,
        _重さの合計100mg_3 is _重さの合計100mg_2 - E * 48,
        D =< _重さの合計100mg_3 // 40,
        _重さの合計100mg_4 is _重さの合計100mg_5 - D * 40,
        C =< _重さの合計100mg_4 // 45,
        _重さの合計100mg_5 is _重さの合計100mg_6 - C * 45,
        B =< _重さの合計100mg_5 // 37,
        _重さの合計100mg_6 is _重さの合計100mg_3 - B * 37,
        A =< _重さの合計100mg_6 // 10,!.

表示する(_取り出した硬貨の合計金額) :-
        writef('%t円\n',[_取り出した硬貨の合計金額]).