如果给出了x
,我怎样才能找到两个数字y
和z
,以便x = y * z
以及y==Z
或y
和z
彼此接近?此外,x
,y
,z
为Integers
。
示例:
x = 16484, y=z=128; x=4096, y=z=4096; x=8192, y=64, z=128
答案 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之间,这种方法适用于那些值。