如何將乙個 10 3,10 15 上的整數盡可能多地表示成n個互不相同的因數乘積?

時間 2021-05-31 05:24:54

1樓:程式小猿

我用遞迴的思路寫了個解法。

相當於從2開始分解因數,每次分解的都比之前的更大。

這樣就確保沒有重複。

測試用例是利用的其它回答的。

2樓:好地方bug

首先你能做的就是 得分解這個數,分解成:

這樣的形式

接下來的問題應該能規約到子集和問題,應該是NPH的,所以只能搜尋剪枝。但是幸運的是, 不是很大,最多40左右,所以不是很難搜尋出來

3樓:

首先,我不會證明這個複雜度是對的(我覺得有問題)。

然後,我看到叉姐都這樣寫了。

最後,你不妨試試吧。。

4樓:

題主的演算法對兩個素因子的數都不成立,考慮這裡遠大於。容易知道題主的方法的結果為:但比它要長。

事實上,這個問題等價為非負整數向量的最長不相等劃分。

提供乙個思路:如果因子序列是最長的,那麼它可以化為以下「標準型」:

滿足的所有因子均屬於,且的任意二分解必有乙個因子屬於。證明很簡單。

這樣的話當某個因子被選定後,那麼這個因子的因子也會被選定。(本質上還是搜尋,但速度應該會更快)

5樓:spiritsaway

考慮有兩個質因數的情況,即可以分解為,此時a與c的值無所謂,我們直接對(b,d)二元組來考慮,事實上我們可以觀察到(b,d)和(d,b)是等價的,所以這個二元組的順序無所謂。

假設我們得到了最多不同因數的分解,其中

對於這裡面每乙個二元組,我們可以對映為乙個整數注意,這是乙個可逆對映。所以任何乙個整數來說最多只有乙個二元組與之對應。對於這個整數的值,我們總共有b*d種選擇。

所以原始問題就轉換成了在乙個含有b*d個整數的集合中找到最大的乙個子集,使得這個子集元素值的總和為。看起來類似於子集和問題(雖然當前證明是反的。。。),無能為力了。

對於多個質因數的情況,比雙質因數更難。。。。。。

6樓:

先把這個是完全分解成 a*2*b*3*c*5*d*7這種形式。這一步就看你能不能找一張現成的質數表了。

然後就是排列組合。2 3 5 7 2*2 2*3 這裡面倒是有點演算法。容我先去吃飯。

7樓:

這可能是一道搜尋題,演算法大概是先分解因數再branch-and-bound。

不過我想到了一種奇葩的演算法,不知道對不對?

先分解因數,然後把各質因數的指數從小到大排列,形成乙個元組。然後從這個元組中一步一步地減去較小的元組(按照分次字典序,即:元組a《元組b,iff degree(a)(2,2,2,6) = (0,0,0,1) + (0,0,1,0) + (0,1,0,0) + (1,0,0,00,0,0,2) + (0,0,1,1) + (0,1,0,1) + (1,0,0,1)

(9, 34) = (0, 1) + (1, 0)+ (0, 2) + (1, 1) + (2, 0)+ (0, 3) + (1, 2) + (2, 1)+ (0, 4) + (1, 3)

+ (0, 5) + (1, 4)

+ (0, 6)

+ (0, 2)(剩下的(0,2)合併到最後乙個tuple(0,6)中,得到(0,8))

python 如何將乙個多維列表中的元素乙個個按順序按順序取出?

navegador 首先宣告,這種問題的正統解法是使用numpy 下面是不考慮效率的通用版本,滿足 python自帶 這個條件,並且可自定義過濾條件與 get函式 import json import ast def flat nest,cond func lambda r type r ast.N...

如何將idea轉化成乙個流行的APP?

蛋炒飯資深研究員 作為乙個連續創業者,曾高峰期拿下2輪融資且成功退出把公司乾死的人來簡述一下這個正經問題。首先,你要區分的是你的想法是商業化還是做著玩 如果不是,接著看。商業化專案,以你的能力是做買賣,還是做生意,還是創業。做買賣一手交錢一手交貨,個體戶即可。做生意需要有一定的經營管理能力,可做到區...

python如何將乙個列表為成績,另乙個列表為分數,將其組合起來的成績和分數按排名高低,輸出來呢

建議使用 Pandas 例如 import pandas aspd course 大學英語A1 高等數學 大學生職業規劃 經濟學 lst df pd.DataFrame lst index course df grade 學分績點 大學英語A1 85 2.0 3.5高等數學 77 0.5 2.7大學...