我发现了类似的问题,但这有点复杂。
我有一个大数n(我实际上有更多,但现在没关系),(> 40位数),我想找到一个* b * c = n三胞胎。 n的主要因子分解已经完成。它没有大的素数除数,但有许多小素数除数。所有主要除数(包括多个除数)的总和大于50.
我想找到一个* b * c = n三元组,其中a <= b <= c。我不想要所有三胞胎,因为它们太多了。我在寻找特别的。
例如:
如果我们知道n = k!(阶乘),这可能会更容易解决。解决可能会导致一般方法。 由于n的大小,用暴力计算所有这些三元组不是一个选项,所以我需要一个好的算法或一些特殊工具来帮助我实现这个解决方案。
抱歉我的英语不好,
感谢您的回答!
答案 0 :(得分:0)
您可以使用简单的O(|D|^2)
算法来实现它,其中D
是您已经拥有的n
所有数字的有序列表。
请注意,您只需查找a,b
,因为c=n/(a*b)
,因此问题归结为找到(a,b)
中的所有对D
,以便a<b
}和n/(a*b) ∈ D
。
伪代码:
result = empty_list
for (int i=0; i<D.size-1, i++) { // O(|D|)
for (j=i+1; j<D.size, j++) { // O(|D|)
a, b = D[i], D[j]
c = n/(a*b)
if (D.contains(c) && c>b) { // O(1)
result.append( (a,b,c) )
}
}
} // O(|D|)*O(|D|)=O(|D|^2)
答案 1 :(得分:0)
我可能有解决方案,但我今天没时间实施。我把它写下来,所以也许有人会同意我或者会发现我算法的弱点。
让我们看看第一种或第二种情况,其中c / a或c-a应该是最小的。
1:在第一步中,我用贪婪算法将n的素因子分成3组。 我将有一个初始a,b和c,它们彼此之间的距离不会太远。主要因素将存储在3个数组中:a_pf,b_pf,c_pf。
2:在下一步中,我计算a,b和c的所有可能因子,我将它们存储在不同的数组中,然后我命令这些数组。这些将是a_all,b_all和c_all。
3:我计算q = max(a,b,c)/ min(a,b,c)。 (现在我们可以说a是最小的,c是最大的数字)
4:我在a_all和c_all上搜索这个条件的数字:c_all [i] / a_all [j]&lt; Q值。当我找到它时,我在a_pf和c_pf中更改这些值的素因子。使用这种方法,三联体中最大和最小的成员将彼此靠近。
我重复步骤2-3-4,直到我可以。我认为这将在有限的步骤后结束。
由于三联体的成员比原来的n小,我希望这个解决方案能在几分钟内给我正确的三联体。