作为我通过项目Euler探索算法的努力的一部分,我正在尝试编写一个接受整数'n',多个因子'k'并将其分解的方法。如果不可能,它将引发错误。
例如,如果我输入factorize(13257440,3),该函数将返回包含3个元素的所有可能唯一集的列表,其中3个元素的乘积等于13257440.
我的第一个是生成n的多组素数因子('m'表示集合的大小),然后将集合划分为k个分区。确定分区大小后,我会将其视为组合问题。
我在为上述两部分制定算法时遇到了麻烦,并且不知道从哪里开始。我用一个简单的解决方案复杂化了一个简单的问题吗?如果没有,推荐的方法是什么?谢谢!
答案 0 :(得分:0)
素数分解
找到所有可以除n
而没有余数的素数。使用Eratosthenes筛来大大加快这个过程。
您可以使用/修改我的(警告此链接是项目Euler扰流器)
现在您需要修改代码,以便将主要列表更改为multiplicants列表。例如,如果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
的{{1}}数字生成处理,而不进行数字重复o
排列。
你可以使用它(警告此链接是Euler剧透):
不要忘记为每个使用的数字设置标志,并在迭代完成后取消设置。重写此函数,使其与调用o!
迭代,findfirst()
类似于我的排列类。
现在,您可以嵌套所有findnext()
次(使用排列链接中的嵌套k
或每次减少for
和k
时递归/ p>