За последние 24 часа нас посетили 138289 программистов и 6673 робота. Сейчас ищет 2071 программист ...

Дружественные числа

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 22 сен 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Задача: найдите все пары дружественных чисел в промежутке от 1 до 10000.

    Проблема: если прописывать пары вручную, то работает хорошо, но если сделать циклом,
    то браузер очень долго думает и выводит 30 секунд, не знаю как запустить все числа.

    PHP:
    1. function getDivisors($count) {
    2.         $dividers = [];
    3.      
    4.         for($i = 1; $i <= $count; $i++) {
    5.             if($i == $count) return $dividers;
    6.          
    7.             if($count % $i == 0) {
    8.                 $dividers[] = $i;
    9.             }
    10.         }
    11.     }
    12.  
    13.     function friendlyNnum($num1, $num2) {
    14.         $arr1 = getDivisors($num1);
    15.         $arr2 = getDivisors($num2);
    16.      
    17.         $res1 = 0;
    18.         $res2 = 0;
    19.      
    20.         foreach($arr1 as $k) {
    21.             $res1 = $res1 + $k;
    22.         }
    23.      
    24.         foreach($arr2 as $j) {
    25.             $res2 = $res2 + $j;
    26.         }
    27.      
    28.         return [$res1, $res2];
    29.     }
    30.  
    31.     $count = 284;
    32.     $count2 = 220;
    33.  
    34.     if(friendlyNnum($count, $count2)[0] == $count2 && friendlyNnum($count, $count2)[1] == $count) {
    35.         echo $count . ' AND ' . $count2 . '<br><br>';
    36.     }
    вот так напишет Maximum execution time of 30 seconds exceeded

    PHP:
    1. for($i = 1; $i <= 10000; $i++) {
    2.         for($j = 1; $j <= 10000; $j++) {
    3.             if(friendlyNnum($i, $j)[0] == $j && friendlyNnum($i, $j)[1] == $i) {
    4.                 echo $i . ' AND ' . $j . '<br><br>';
    5.             }
    6.         }
    7.     }
    --- Добавлено ---
    А можно ли как-нибудь сделать разрывной цикл, что бы такого не было? Например сделать 300 итераций, завершить цикл и перейти совсем к другому циклу, а там начать с 301?
    --- Добавлено ---
    Да можно, я проверил, но это наверно очень грубый костыль?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Что такое дружественные числа? Я такой термин не помню из математики.
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    1 привет привет 1
    1 привет пока 2
    --- Добавлено ---
    только вот что скрипт делает хрен пойми
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    MouseZver нравится это.
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Ищет дружественные числа.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Чего это я вдруг "Вы" стал? :) Брось ты это.
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.543
    Симпатии:
    623
    В этой функции нет return.

    10000x10000 - сто миллионов итераций.
    Сделай прост
    Код (Text):
    1. <?php
    2. set_time_limit(600);
    так до 10 минут сможет скрипт работать.
     
    Dimon2x нравится это.