このディレクトリの索引
#  出典 :: プログラミングのお題スレ 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乗の和が元の数と等しくなるものをすべて) :-
        n桁の自然数の下限と上限(_n,_自然数下限,_自然数上限),
        findall(_自然数,(
                    between(_自然数下限,_自然数上限,_自然数),
                    n桁の自然数で各桁の数のn乗の和と等しくなる(_n,_自然数)),
                _自然数nが与えられたときn桁の自然数で各桁の数のn乗の和が元の数と等しくなるものをすべて).

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

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

各桁の数(N,_各桁の数) :-
        N > 0,
        _各桁の数 is N mod 10.
各桁の数(N,_各桁の数) :-
        N > 0,
        N_1 is N // 10,
        各桁の数(N_1,_各桁の数).