2014-02-21 3 views
1

Вот мой код:Мне нужно найти все дружные числа до определенного числа

$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>"; 
    } 
} 

Я не знаю, что щеколда проблема!

FYI: 220 и 284 - пример дружественных чисел. Сумма собственных делителей одного числа равна другому числу и наоборот (wiki).

+1

В цикле 'for ($ s = 1 ....)' вы начинаете с '$ s = 1' и увеличиваете это. Таким образом, '$ s' никогда не может быть' 0', и поэтому '$ set2' всегда будет' 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.

Предупреждение: Большие количества займет очень много времени!

Смежные вопросы