簡體   English   中英

列出將所有數字分解為k個因子的所有可能方法的算法?

[英]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個分區。 確定分區大小后,我將其視為組合問題。

但是我在為以上兩個部分制定算法時遇到了麻煩,並且不知道從哪里開始。 我是否在通過簡單的解決方案使一個簡單的問題復雜化? 如果沒有,推薦的方法有哪些? 謝謝!

  1. 素數分解

    找出所有可以除以n數。 使用Eratosthenes篩子可大大加快此過程。

    您可以使用/修改我的( 警告此鏈接是項目Euler Spoiler

    現在,您需要修改代碼,以便素數列表將更改為被申請人列表。 例如,如果n=12則將發現{ 2,3 }而您需要{ 2,2,3 }因此,如果找到除數質數,則一次又一次地檢查它,直到每次減小n都不再可除。

    向找到的每個素數添加一個標志(是否使用?)以加快下一步操作...

  2. 組合部分

    我假設乘數可以相同,因此在開始時將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 ■從排列鏈接或通過遞歸每次減輕kn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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