[英]Algorithm to list all possible ways to break a number into k factors?
通過項目Euler探索算法的一部分,我正在嘗試編寫一種方法,該方法將接受整數'n',因數'k'並將其分解。 如果不可能,將拋出錯誤。
例如,如果我輸入factorize(13257440,3),該函數將返回包含3個元素的所有可能唯一集的列表,其中3個元素的乘積等於13257440。
我的第一個方法是生成n個質數因子的多集合(“ m”代表集合的大小),然后將集合划分為k個分區。 確定分區大小后,我將其視為組合問題。
但是我在為以上兩個部分制定算法時遇到了麻煩,並且不知道從哪里開始。 我是否在通過簡單的解決方案使一個簡單的問題復雜化? 如果沒有,推薦的方法有哪些? 謝謝!
素數分解
找出所有可以除以n
數。 使用Eratosthenes篩子可大大加快此過程。
您可以使用/修改我的( 警告此鏈接是項目Euler Spoiler )
現在,您需要修改代碼,以便素數列表將更改為被申請人列表。 例如,如果n=12
則將發現{ 2,3 }
而您需要{ 2,2,3 }
因此,如果找到除數質數,則一次又一次地檢查它,直到每次減小n
都不再可除。
向找到的每個素數添加一個標志(是否使用?)以加快下一步操作...
組合部分
我假設乘數可以相同,因此在開始時將k
乘以1
到質數列表,並創建函數,該函數從找到的未使用質數中創建多達x
所有數字。 添加未使用的質數m
的計數器,因此在開始時將m
設置為素數列表大小,並且所有標志均設置為未使用。
現在,您需要從列表中找到使用1..m-k+1
數字的所有可能性。 每次迭代都將選擇的數字設置為已使用並減少m
因此它類似於:
for (o=1;o<=m-k+1;o++)
在這里找到所有組合o
未使用的號碼,把它處理o
與基地位數代o
沒有數字重復次數是o!
排列。
您可以使用此( 警告此鏈接為Euler spoiler ):
不要忘記為每個使用的數字設置標志,並在迭代完成后取消設置。 重寫此函數,以便通過調用findfirst()
和findnext()
進行迭代,類似於我的置換類。
現在,您可以嵌套這一切k
倍(使用嵌套for
■從排列鏈接或通過遞歸每次減輕k
和n
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.