我需要找到所有友好数字达到一定数量

时间:2014-02-21 13:11:32

标签: php math

这是我的代码:

$n = 300;
$set = 0;
$set2 = 0;

for($i = 1; $i<$n; $i++)
{

    for($j = 1; $j <$i; $j++)
    {
        $qol = $i % $j;

        if($qol == 0)
        {
            $set += $j;
        }
    }

   for($s=1; $s<$set; $s++)
   {
        $qol2 = $set % $s;

        if($s == 0)
        {
            $set2 += $s;
        }
   }

   if($set2 == $i)
     {
        echo "$set and $i  are amicable numbers</br>";
     }
}

我不知道问题到底是什么!

仅供参考:220和284是友好数字的一个例子。一个数的适当除数的总和等于其他数,反之亦然(wiki)。

1 个答案:

答案 0 :(得分:0)

我遇到了你的逻辑问题。在你的代码中,$set2 == $i将如何成为真实?在我看来,$i总会更大。


我会按以下方式进行:

首先创建一个单独的函数,找到适当除数的总和:

// Function to output sum of proper divisors of $num
function sumDiv($num) {
    // Return 0 if $num is 1 or less
    if ($num <= 1) {
        return 0;
    }

    $result = 1; // All nums divide by 1
    $sqrt = sqrt($num);

    // Add divisors to result
    for ($i = 2; $i < $sqrt; $i++) {
        if ($num % $i == 0) {
            $result += $i + $num / $i;
        }
    }
    // If perfect square add squareroot to result
    if (floor($sqrt) == $sqrt) {
        $result += $sqrt;
    }
    return $result;
}

接下来检查每次迭代是否匹配:

$n = 1500;

for ($i = 1; $i < $n; $i++) {
    // Get sum of proper devisors of $i, and sum of div. of result.
    $currentDivs = sumDiv($i);
    $resultDivs = sumDiv($currentDivs);

    // Check for a match with sums not equal to each other.
    if ($i == $resultDivs && $currentDivs != $resultDivs) {
        echo "$i and $currentDivs are amicable numbers<br>";
    }
}

这是一个正常运作的phpfiddle

警告:大数字需要很长时间才能处理!