簡體   English   中英

如何查找列表中的數字是否是其他兩個數字的乘積?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM