问题出在你的线上
if len(possible[i]) == 20:
你的意思是说
if len(possible) == 20:
事实上,您的代码将继续运行 - 并且大概,由于循环计数如此之大,一些堆栈已填满......
另外-尽管我不确定您要达到什么目的,但您的break
命令位于最内层循环中-因此您跳出它,然后再四处走动……由于长度仅为20
一次,因此您仍然卡住。检查你的逻辑。
例如,对您的代码进行以下小的更改会产生有用的输出(虽然我不知道它是否对您有用......但它可能会给您一些想法):
divisible = True
possible = dict()
for i in xrange(1, 100000000):
for n in xrange(1, 21):
if i%n != 0:
divisible = False
else:
if i in possible:
possible[i].append(n)
else:
possible[i] = [n]
if len(possible) == 20:
print i
break
else:
print i, possible[i]
输出:
1 [1]
2 [1, 2]
3 [1, 3]
4 [1, 2, 4]
5 [1, 5]
6 [1, 2, 3, 6]
7 [1, 7]
8 [1, 2, 4, 8]
9 [1, 3, 9]
10 [1, 2, 5, 10]
11 [1, 11]
12 [1, 2, 3, 4, 6, 12]
13 [1, 13]
14 [1, 2, 7, 14]
15 [1, 3, 5, 15]
16 [1, 2, 4, 8, 16]
17 [1, 17]
18 [1, 2, 3, 6, 9, 18]
19 [1, 19]
20
编辑更仔细地阅读代码,我认为您要做的是找到正好有 20 个因子的数字;因此你的情况是正确的。问题是您还存储了所有其他术语 - 这是非常多的列表。如果您只在最后一个数字之后(毕竟唯一的输出i
就在休息之前),那么您真的不需要保留所有其他术语。下面的代码就是这样做的——它一直在我的电脑上愉快地运行,现在最长的时间占用了大约 20 MB 的内存(但还没有答案......)
divisible = True
possible = [];
biggest = 0;
bigN = 100000000;
for i in xrange(1, bigN):
for n in xrange(1, 21):
if i%n != 0:
divisible = False
else:
if len(possible) > 0:
possible.append(n)
else:
possible = [n]
if len(possible) >= 20:
print i
print possible
break
else:
if bigN < 1000:
print i, possible; # handy for debugging
if biggest < len(possible):
biggest = len(possible);
possible = []
计算您正在做的事情的“手动”方法是找到从 1 到 20 的所有数字的质因数;计算每个素数出现的最大次数;并服用他们的产品:
2 = 2
3 = 3
4 = 22
5 = 5
6 = 2 3
7 = 7
8 = 222
9 = 33
10 = 2 5
11 = 11
12 = 22 3
13 = 13
14 = 2 7
15 = 3 5
16 = 2222
17 = 17
18 = 2 33
19 = 19
20 = 22 5
答案:(2*2*2*2)*(3*3)*5*7*11*13*17*19 = 232792560