我写了一些代码,以找到可乘的持久性数。它适用于少量数字,但一段时间后会中断,我不知道为什么。如果您不知道这是什么,请观看https://www.youtube.com/watch?v=Wim9WJeDTHQ。
无论如何,我的想法是从一个较小的数字开始,例如10,然后再乘以它们的数字(25和52),找出哪个数字“转到” 10。现在重复此过程(对于25,我们达到55),直到不能将数字除以小于10的因子为止(55是5,而11和11是质数,因此我们不能继续)。
def search(start, steps = 0):
"""input int"""
next = find_divider(start)
if next == None:
yield steps
else:
for new in perm_set(next):
print(new)
yield from search(new, steps + 1)
def find_divider(n, father = ""):
if n == 1:
return father
for prime in [2,3,5,7]:
if n % prime == 0:
return find_divider(n/prime, father + str(prime))
return None
def perm_set(n):
"""input string
output int """
# dp is a custom function for distinct permutaions (it works fine)
perms = (p for p in dp(n))
for p in perms:
yield int(p)
for p in multi_perm_set(n):
yield int(p)
def multi_perm_set(n):
"""
input: string
output: int """
if '2' in n and '2' in n.replace('2','',1):
yield from perm_set(n.replace('2','',2) + '4')
if '2' in n and '4' in n:
yield from perm_set(n.replace('2','',1).replace('4','',1) + '8')
if '2' in n and '3' in n:
yield from perm_set(n.replace('2','',1).replace('3','',1) + '6')
if '3' in n and '3' in n.replace('3','',1):
yield from perm_set(n.replace('3','',2) + '9')
return ()
find_divider查找小于10的质数分隔符,并将其作为字符串返回。如果质数除法器> 10,则返回None。
perm_set接受一个数字(例如223)并产生所有不同的排列(所以223、232、322以及43、34和26、62,因为所有这些数字在乘以它们的数字时都达到12。)因此,当我运行程序并检查数字时,发现开始时一切正常,但后来由于某种原因出错。例如,我使用输入(10,1)运行该程序,因为10已经是达到一位数字的第一步。我得到:25-> 55:3步,52:2步 哪个是对的。但是当我在8上运行它时,它并没有走到尽头,经过数千个数字后,它开始为步骤写错数字。有人对为什么有任何想法吗?我认为也许与许多递归步骤有关。可以吗
编辑:我做了一个函数来测试找到的每个数字,结果证明它在完成后再次通过所有数字,但是使用step = step + 1。仅发生在<10的数字上。
谢谢
答案 0 :(得分:0)
发现了问题。以8为例:find_divider返回222作为他的主要因子“父亲”。然后perm_set函数将其转换为222、24、42和8。因此,我们再次搜索8,但是这次使用steps = steps +1。