N の数字の合計の特定の累乗が N に等しいすべての整数 (N) を見つける Python スクリプトを作成しようとしています。たとえば、8 + 1 = 9 であるため、N=81 が該当します。ある 9 のべき乗 (つまり 2) = 81.
私が選択した範囲は任意です。私のスクリプトは機能しますが、非常に遅いです。理想的には、約 6000 ミリ秒で最初の 30 個の整数を見つけたいと思います。
私の最初の解決策:
def powerOfSum1():
listOfN = []
arange = [a for a in range(11, 1000000)] #range of potential Ns
prange = [a for a in range(2, 6)] # a range for the powers to calculate
for num in arange:
sumOfDigits = sum(map(int, str(num)))
powersOfSum = [sumOfDigits**p for p in prange]
if num in powersOfSum:
listOfN.append(num)
return listOfN
2 番目の解決策では、sumOfDigits ごとにすべてのべき乗を格納しようとしましたが、パフォーマンスはあまり向上しませんでした。
def powerOfSum2():
listOfN = []
powers= {}
for num in range(11, 1000000):
sumOfDigits = sum(map(int, str(num)))
summ = str(sumOfDigits)
if summ in powers:
if num in powers[summ]:
listOfN.append(num)
else:
powersOfSum = [sumOfDigits**p for p in range(2,6)]
powers[summ] = powersOfSum
if num in powers[summ]:
listOfN.append(num)
return listOfN
私はまだデータ構造とアルゴリズムを勉強していないので、このスクリプトをより効率的にするためのヒントをいただければ幸いです。