@zzzmaikzzz
Junior-web

Как правильно составить функцию наибольшего числа на php?

Например из чисел [3, 24, 4] мы можем составить такие: 3244, 3424, 2434, 2443, 4324, 4243 и самое больше из них это 4324
$arrNum = [3, 24, 4];
$sizeArr = count($arrNum);
$fact = factorial($sizeArr);

while ((boolean)$sizeArr) {
    for ($j = (count($arrNum) - 1); $j; $j--) {
        list($arrNum[$j], $arrNum[$j - 1]) = [$arrNum[$j - 1], $arrNum[$j]];
        $arrSum[] = implode("",$arrNum);
    }
    $sizeArr--;
}

echo max($arrSum);

function factorial($n)
{
    $result = 1;
    for ($i=2; $i<=$n; $i++)
        $result *= $i;
    return $result;
}


Данное решение моё работает только с малым размером... а надо обработать [1, 34, 3, 98, 9, 76, 45, 4]

Помогите с алгоритмом
  • Вопрос задан
  • 311 просмотров
Решения вопроса 2
muhammad_97
@muhammad_97
PHP-разработчик
<?php

$numbers = [1, 15, 3, 9800, 9, 76, 45, 9];
$arr = [];

$maxLength = max(array_map('strlen', $numbers));

foreach ($numbers as $number) {
    $key = str_pad((string) $number, $maxLength, $number);

  $arr[$key] = array_key_exists($key, $arr) ? $arr[$key].$number : $number;
}

ksort($arr);

$arr = array_reverse($arr);

var_dump(implode('', $arr));


Алгоритм:

Сравниваем цифры в числе одно за другим. При первом же несовпадении число с большей цифрой ставится влево:

45 36 => 4534

4 > 6  // первое число ставится влево 

928 998 => 998928

9 = 9
2 < 9 // второе число ставится влево


Это если их длины равны. Если нет, то просто начинаем сравнение с начала:
456 4

4 = 4
5 > 4 // начинаем сравнивать с начала, первое число ставится влево 

928 92

9 = 9
2 = 2
8 < 9 // начинаем сравнивать с начала, второе число ставится влево


Думаю непонятно объяснил, но что поделать
Ответ написан
@zzzmaikzzz Автор вопроса
Junior-web
$numbers = [1, 15, 3, 9800, 9, 76, 45, 9];
$arr = [];

$maxLength = max(array_map('strlen', $numbers));

foreach ($numbers as $number) {
    $key = str_pad((string) $number, $maxLength, $number);
   
    $arr[$key] .=$number;
  }

krsort($arr);

var_dump(implode('', $arr));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
23 апр. 2024, в 08:58
15000 руб./за проект
23 апр. 2024, в 08:42
60 руб./за проект