このディレクトリの索引
#  出典 :: プログラミングのお題スレ part3 #573
#  
#  お題:自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。
#  例
#  n=4 -> 1634 8208 9474
#  n=5 -> 54748 92727 93084
#  n=8 -> 24678050 24678051 88593477 
#  

'自然数nが与えられたとき、n桁の自然数で各桁の数のn乗の和が元の数と等しくなるもの(たとえばn=3のとき 370 = 3^3 + 7^3 + 0^3 = 27 + 343 + 0)をすべて求める。'(_n,_自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて) :-
        findall(_n桁の自然数,(
                    n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_n桁の自然数)),
                _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて).

n桁の自然数で各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数) :-
        n桁の自然数で(_n,_n桁の自然数),
        各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数).

n桁の自然数で(_n,_n桁の自然数) :-
        n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限),
        between(_n桁の自然数下限,_n桁の自然数上限,_n桁の自然数).

n桁の自然数の下限と上限(_n,_n桁の自然数下限,_n桁の自然数上限) :-
        _n桁の自然数下限 is 10 ^ (_n - 1),
        _n桁の自然数上限 is 10 ^ _n - 1.

各桁の数のn乗の和と等しくなるもの(_n,_n桁の自然数),
        各桁の数のn乗の(_n,_n桁の自然数,[],_各桁の数のn乗のならび),
        和(_各桁の数のn乗のならび,_n桁の自然数).

和(_数ならび,_和) :-
        sum_list(_数ならび,_和).

各桁の数のn乗の(_n,0,_各桁の数のn乗のならび,_各桁の数のn乗のならび) :- !.
各桁の数のn乗の(_n,N,L1,_各桁の数のn乗のならび) :-
        _各桁の数のn乗 is (N mod 10) ^ _n,
        N_1 is N // 10,
        各桁の数のn乗の(_n,N,[_各桁の数のn乗|L1],_各桁の数のn乗のならび) :-