![](/img/trans.png)
[英]How to find if a number in a list is in a interval of two numbers in a list?
[英]How to find if a number in the list being the product of other two numbers?
我試圖找出任何數字(在數字從 1 到 100000 的列表中)是否可以是列表中其他兩個數字的乘積。 如果是這樣,他們可以組成一個小組。
例如,6 = 2 x 3,因此 2、3、6 可以組成一組。
因此,我目前的方法是先將列表分成三元列表,然后檢查每個組是否有效。 如果有效,則將組中最大的數存儲在列表“maxs”中。 如果不是,系統將忽略它。
檢查完所有組后,我想打印“maxs”中的最大值。
因此,我有以下代碼。
import itertools
rans = list(range(1, 10 ** 5))
all_com = []
maxs = []
for ran in rans:
coms = itertools.combinations(rans,3)
coml = list(coms)
all_com += coml
for com in all_com:
com = [int(n) for n in com]
if com[0] == com[1] * com[2] or com[1] == com[0] * com[2] or com[2] == com[0] * com[1]:
maxs.append(max(com))
print(max(maxs))
雖然它可以運行,但它變成了一個巨大的 RAM 吞噬者,甚至破壞了 Google Colab。 另外,代碼太慢了。
我可以知道是否有辦法防止此試驗使任何 RAM 過載或什至更快的方法來做同樣的事情? 謝謝!
所以我最終得到了那個
import random
rans_dict = {k: None for k in list(set([random.randint(1, 100000) for i in range(100000)]))}
for key, value in rans_dict.items():
for i in range(2, int(key ** 0.5) + 2):
if key % i == 0 and key // i in rans_dict:
rans_dict[key] = (i, key // i)
print(rans_dict[232])
所以我使用 dict 進行O(1)
訪問(以加快速度)。 然后我只是檢查每個數字的因子( O(nlogn)
),如果除數和 qoutient 都在字典中(所以使用了O(1)
字典鍵)。 然后將它們添加到字典值中。
這應該更快並且占用更少的內存。
如果我理解正確的話,我們只對兩個數字的乘積感興趣。 所以我們可以使用for j in rans[i-1:]
去掉所有測試的50%(3 * 2 = 6和2 * 3 = 6是一樣的,所以我們只需要檢查3 * 2)
rans = list(range(1, 10 ** 5))
maxrans = max(rans)
maxs = set()
for i in rans:
for j in rans[i-1:]: # We don't need to check 3*2 if we have checked 2*3
tmp = i*j
if tmp < maxrans: # i*j can't be bigger than 10 ** 5
maxs.add(tmp)
else:
break
print(max(maxs))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.