Нашел не много трудную для меня задачу, пока еще не пытался сделать, но уже сомневаюсь что получится, поэтому вот..
Дружественные числа - два различных числа, для которых сумма всех собственных делителей первого числа равна второму числу и наоборот, сумма всех собственных делителей второго числа равна первому числу.
Например, 220 и 284. Делители для 220 это 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, сумма делителей равна 284. Делители для 284 это 1, 2, 4, 71 и 142, их сумма равна 220.
Задача: найдите все пары дружественных чисел в промежутке от 1 до 10000. Для этого сделайте вспомогательную функцию, которая находит все делители числа и возвращает их в виде массива. Также сделайте функцию, которая параметром принимает массив, а возвращает его сумму.
Помогите
PHP
Задачка по PHP (Создание функции)
Не надо делать "функцию, которая параметром принимает массив, а возвращает его сумму". Эта функция уже есть в языке: https://www.php.net/manual/ru/function.array-sum.php
function dividers($n) { // возвращает массив всех делителей $n
$r = [];
for ($t = 1; $t * $t < $n; ++$t) {
if ($n % $t == 0) {
$r[] = $t;
$r[] = $n / $t;
}
}
if ($t * $t == $n) { $r[] = $t; }
return $r;
}
for ($i = 1; $i < 10000; ++$i) {
for ($j = $i + 1; $j <= 10000; ++$j) {
if (array_sum(dividers($i)) == $j && array_sum(dividers($j)) == $i) {
echo $i, ' ', $j, "\n";
}
}
}
function dividers($n) { // возвращает массив всех делителей $n
$r = [];
for ($t = 1; $t * $t < $n; ++$t) {
if ($n % $t == 0) {
$r[] = $t;
$r[] = $n / $t;
}
}
if ($t * $t == $n) { $r[] = $t; }
return $r;
}
for ($i = 1; $i < 10000; ++$i) {
for ($j = $i + 1; $j <= 10000; ++$j) {
if (array_sum(dividers($i)) == $j && array_sum(dividers($j)) == $i) {
echo $i, ' ', $j, "\n";
}
}
}
Андрей Юрьевич
Странно, но код не работает, ничего не выводит.
Олег Рогов
Что за потреблядство и неуважение к людям? Вам человек помог с задачей. Ни лайка, не выбора лучшего ответа.
https://pastebin.com/wk0C0pNn
Я только не пойму, а зачем вам это всё нужно? В школе PHP не проходят. Значит, это какие-то курсы или техникум/вуз. Так вот, извините, но если вы даже ЭТО не можете выполнить, значит вам нечего делать в профессии. Это самые азы.
Если вы пропустили какую-то тему (циклы? функции? массивы?), значит нужно срочно нанимать репетитора или попытаться разобраться по урокам в интернете самому. Срочно! Дальше будет хуже.
Я только не пойму, а зачем вам это всё нужно? В школе PHP не проходят. Значит, это какие-то курсы или техникум/вуз. Так вот, извините, но если вы даже ЭТО не можете выполнить, значит вам нечего делать в профессии. Это самые азы.
Если вы пропустили какую-то тему (циклы? функции? массивы?), значит нужно срочно нанимать репетитора или попытаться разобраться по урокам в интернете самому. Срочно! Дальше будет хуже.
идеальное решение, выглядит очень даже симпотично
Скрипт рабочий, но обрабатывает секунд 6-7, из-за отрезка до 10000:
//Находить делители числа
function allDivisorsOfNum($num){
$arrDiv = [];
for ($i=1; $i <= $num; $i++) {
if ($num % $i == 0) {
$arrDiv[] = $i;
}
}
return $arrDiv;
}
//Легче использовать встроенную array_sum, но в задаче указано создать собственную
function arrSum($arr){
$result = 0;
foreach ($arr as $value) {
$result += $value;
}
return $result;
}
//Вот и сам способ
for ($i=1; $i <= 10000; $i++) {
$one = allDivisorsOfNum($i);
array_pop($one);
$newOne = array_sum($one);
$two = allDivisorsOfNum($newOne);
array_pop($two);
$newTwo = array_sum($two);
if ($i == $newTwo && $i != $newOne) {
echo "$i - $newOne; ";
}else{
continue;
}
}
Буду благодарен, если кто-то покажет более эффективный метод поиска
//Находить делители числа
function allDivisorsOfNum($num){
$arrDiv = [];
for ($i=1; $i <= $num; $i++) {
if ($num % $i == 0) {
$arrDiv[] = $i;
}
}
return $arrDiv;
}
//Легче использовать встроенную array_sum, но в задаче указано создать собственную
function arrSum($arr){
$result = 0;
foreach ($arr as $value) {
$result += $value;
}
return $result;
}
//Вот и сам способ
for ($i=1; $i <= 10000; $i++) {
$one = allDivisorsOfNum($i);
array_pop($one);
$newOne = array_sum($one);
$two = allDivisorsOfNum($newOne);
array_pop($two);
$newTwo = array_sum($two);
if ($i == $newTwo && $i != $newOne) {
echo "$i - $newOne; ";
}else{
continue;
}
}
Буду благодарен, если кто-то покажет более эффективный метод поиска
Похожие вопросы
- Для чего нужны функции pack () и unpack () в PHP ?
- В чём приемущество создания вёрстки на php в сравнении с вёрсткой html?
- Помогите с php кодом, плиз) хотел функцию транслитерации написать, только ошибка выходит и все :(
- Есть ли какой-нибудь тайм аут на работу времени функции в php?
- В чём смысл функции chop в php?
- Без php можно создать красивый сайт с красивым дизайном? Какую вообще роль играет php в создании сайта?
- Вопрос к PHP-программистам и людям с опытом создания telegram-ботов. Спасибо заранее!
- PHP Polling ChatGPT
- Как оптимизировать структуру сайта php. на готовом шаблоне
- PHP. Почему нельзя применять функцию count() к строкам? Ведь строка это тот же массив