我正在尝试编写一个Python脚本,查找所有整数(N),使得数字N的各位数之和的某个次幂等于N。例如,N=81就符合条件,因为8 + 1 = 9,并且9的某个次幂(即2)等于81。
我选择的范围是任意的。我的脚本可以工作,但非常非常慢。理想情况下,我希望在大约6000毫秒内找到前30个这样的整数。
我的第一个解决方案:
我选择的范围是任意的。我的脚本可以工作,但非常非常慢。理想情况下,我希望在大约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
在我的第二个解决方案中,我尝试存储每个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
我还没有学习数据结构和算法,因此希望能够得到任何关于如何使这个脚本更加高效的指导。
arange = range(11, 1000000)
的作用类似于arange = [a for a in range(11, 1000000)]
。 - Jose Ricardo Bustos M.