Python 什么限制会导致此脚本卡住?
我在用python做一个数学拼图,你会发现数字的序列是k个数字,每个数字的乘积等于这些数字的和,即k=3 1*2*3=1+2+3 我对python和编程基本上是新手,我很好奇为什么会有一个“下降”,它可以非常快地计算到某个点,然后程序就卡住了Python 什么限制会导致此脚本卡住?,python,Python,我在用python做一个数学拼图,你会发现数字的序列是k个数字,每个数字的乘积等于这些数字的和,即k=3 1*2*3=1+2+3 我对python和编程基本上是新手,我很好奇为什么会有一个“下降”,它可以非常快地计算到某个点,然后程序就卡住了 psnumbers = [] #this gives me a number to start a for loop later in the script def ones(n): string = '1'*n return int(s
psnumbers = []
#this gives me a number to start a for loop later in the script
def ones(n):
string = '1'*n
return int(string)
#multiplies and adds the digits together and compares the values
def check(n):
global psnumbers
add = 0
mult = 1
for i in range(len(n)):
add += int(n[i])
mult*= int(n[i])
if add == mult and n[0] != 0:
print(n)
psnumbers.append(n)
return True
else:
return False
#starts checking numbers, starting with the value from ones()
def loop(n):
for x in range(2,n+1):
for i in range(ones(x),ones(x)*2):
if check(str(i)) == True:
break
else:
continue
#loop(23) works for me fine, but loop(n) where n>=24 doesn't finish processing
loop(23)
循环(n)的所有值,其中n是否确定在n=24时存在解决方案?我认为您的代码正在按预期工作,需要很长时间才能得到正确答案。 我改变了你的循环,所以我只在n=24时寻找解决方案,并打印出它正在尝试的数字。。。这将允许您在命令行上运行它,并打印出它正在尝试的数字,您可以看到为什么需要这么长时间
def loop(n):
x = n
for i in range(ones(x),ones(x)*2):
print('\r' + str(i), end='')
if check(str(i)) == True:
break
else:
continue
print('done')
这个数字要高得多
n=23>>11111111111111228
n=24>>111111111111112163473
在我达到jupy笔记本极限之前
我不确定你是否有时间让电脑来解决这个问题,比如说你可以每秒检查1000个数字,这需要你10^24*10^-4=10^20秒。。。或1.15740741×1015天
。您可能需要做一些复杂的逻辑来避免两次检查相同的数字(对于您的算法,112==121)
您的问题“为什么这需要更长时间”的答案是,对于n=24,答案离您的起点远比n=23远。对于任何给定的字符串长度,在找到单一解决方案后,您的代码将退出。碰巧,对于n
到23的任何值,都有一个简单的解决方案
然而,当我们得到n=24时,所有前导的1
s的开销最终会滑过小数值的各种数值性质,并且没有这样的解决方案
我更改了算法“查找所有此类数字”的指令,并在每个循环前后添加了一个简单的time()
调用
def loop(n):
for x in range(2,n+1):
start = time()
for i in range(ones(x),ones(x)*2):
check(str(i))
print(x, time() - start)
n
的前几个值的计时为
n time (sec)
2 0.00010895729064941406
3 0.0007987022399902344
4 0.008989572525024414
5 0.08109426498413086
6 0.6398007869720459
7 6.47220778465271
8 70.14981818199158
如果您编写代码只处理非递减序列(数字按数字顺序排序),并进行检查以确保乘积在和的范围内,则可以大大加快速度。据我所知,该属性没有24位数字。你只需要检查一下