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

Find two factors of a number, which are similar or close to each other

给定一个数字 x,我如何找到两个数字 yz,使得 x = y * zy==Z 或 [=12] =] 和 z 很接近?另外 x,y,zIntegers.

示例:

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

我能想到的最简单的方法是使用质因数分解,然后对列表进行排序,并将彼此的值乘以 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。也许有人可以就如何解决这个问题提出建议。

编辑2: 不确定是否正确,但您可以先按最大素数对它们进行排序,然后将两个最大素数放入 y 和 z 中。然后每个后续素数将乘以 y 或 z 的最小值。我不确定这个解决方案是否 100% 有效,但我在纸上尝试了几个案例,它似乎足够好。在 2 到 1 000 000 之间对其进行了测试,此方法适用于这些值。

考虑以下因素:

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

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