【发布时间】:2012-04-08 09:41:00
【问题描述】:
我之前问过这个问题,但现在无法访问该帐户,所以我再次问它以显示我的努力。
给定一个数字列表(数组)和一个数字 N,找到 N 的所有除数,其中不除任何属于该列表的数字。我已经用蛮力和一些有效的方法(但不是最好的方法)解决了它。因此,我正在寻找一种可能是解决此类问题的最佳方法。一切都是整数(没有浮点数)。
我的方法是首先找到数字 N 的所有除数(没有任何开销)。然后,我将列表和除数以相反的顺序(单独)排序。现在,对于每个除数 D,我检查它是否除以列表中的任何数字(从最高元素开始到 >= 除数 D 的元素)。如果它除,那么 D 的所有除数也必须除。然后我从除数列表中删除这些元素,这些元素也是 D 的除数(可以认为是删除交集)。因此,最终除数的左数组是所需的数组(根据我的方法)。如果有人可以指出我的方法中的任何错误或效率低下,我们将不胜感激。列表中可以存在的最大值是 10^18。
我已经在 PHP 中实现了它。我在下面提供我的代码。请忽略 cmets。
while($div=each($divisors))
{
$i=0;
$divisor=$div['key'];
//echo "divisor is $divisor\n";
while((int)$unfriendly[$i]>=$divisor)
{//echo "aya\n";
if(!((int)bcmod($unfriendly[$i],$divisor)))
{//echo "ayeea\n";
$divisors_of_divisor=divisors_of_a_number($divisor);
//print_r($divisors_of_divisor);
//print_r($divisors);
foreach($divisors_of_divisor as $d)
unset($divisors[$d]);
//print_r($divisors);
break;
}
++$i;
}
}
echo sizeof($divisors);
function divisors_of_a_number($n)//returns all the divisors of a number in an unsorted array
{
$i=1;
$s=sqrt($n);
while($i<=$s)
{
if(!($n%$i))
{
$a[]=$i;
if($i!=$s)
$a[]=$n/$i;
}
++$i;
}
return $a;
}
function divisors_of_a_number_as_keys_of_array($n)//returns all the divisors of a number in an unsorted array as keys
{
$i=1;
$s=sqrt($n);
while($i<=$s)
{
if(!($n%$i))
{
$a[$i]=1;
//if($i!=$s)
$a[$n/$i]=1;
}
++$i;
}
return $a;
}
【问题讨论】:
-
我在上一个问题中添加了相关的补充[代码快照与您的尝试],并投票结束。
-
@amit 把问题转给codereview.stackexchange.com 怎么样?
-
@vitalik:(1)我不是版主,只是一个有编辑权限的人,所以我做不到。 (2) 我认为它不适合 codereview.SE。他不是要求审查,而是要求完全不同的方法,并提供他以前的尝试,因为就像每个 SO 问题一样,在提出问题之前需要进行体面的研究。
-
@amit 不关门,可以帮忙解决问题
-
@vitalik 你朋友也一样。我已经提到我之前曾询问过,但该帐户无法访问。
标签: php algorithm numbers primes