找出一个数字的两个因子,它们彼此相似或相近

时间:2015-01-19 10:00:28

标签: factors

如果给出了x,我怎样才能找到两个数字yz,以便x = y * z以及y==Zyz彼此接近?此外,xyzIntegers

示例:

x = 16484, y=z=128;   x=4096, y=z=4096;  x=8192, y=64, z=128

2 个答案:

答案 0 :(得分:2)

请考虑以下事项:

for (int i=sqrt(x); i>=1; --i)
{
    if ( x % i == 0 )
    {
        cout << " y = " << i << endl;
        cout << " z = " << x / i << endl;
        break;
    }
}

这会达到目的吗?你能想到任何可能无效的测试用例吗?

答案 1 :(得分:0)

我能想到的最简单的方法是使用素数因子分解,然后对列表进行排序,并将每个其他值多个为y,其余值为z。那么你应该有两个尽可能接近的因素。可能有一种更有效的方法可以做到这一点但我现在想不到一个。

编制素数因子分解的示例: http://www.geeksforgeeks.org/print-all-prime-factors-of-a-given-number/

示例:x = 24,24 = 2 * 2 * 2 * 3,y = 2 * 2且z = 2 * 3.因此x = y(4)* z(6)= 24

编辑: 我意识到这不起作用,因为如果你有数字2,2,731,z和y的正确值将是4和731,而不是2和1462,我的解决方案将给出。也许有人可以提出如何解决这个问题的建议。

EDIT2: 不确定是否正确,但你可以先按最大的素数对它们进行排序,然后将两个最大的素数加到y和z中。然后将每个后续素数乘以y或z的最小值。我不确定这个解决方案是否100%有效,但我在纸上尝试了几个案例,看起来还不错。测试它在2到1 000 000之间,这种方法适用于那些值。