Здравствуйте! Заранее сильно извиняюсь за всё. Помогите пожалуйста начинающему программисту. Есть две задачи : 1) Нужно написать функцию, которая на вход получает положительное число и возвращает число, которое показывает, какое количество раз нужно умножить цифры числа, перед тем как вы получите число, которое содержит единственную цифру (0..9). Тестовые данные: task2(39) === 3 //3 * 9 = 27 (шаг 1) , 2 * 7 = 14 (шаг 2), 1 * 4 = 4 (шаг 3)task2(777) === 4 // 7 * 7 * 7 = 343 (1 шаг), 3 * 4 * 3 = 36 (2 шаг), 3 * 6 = 18 (3 шаг), 1 * 8 = 8 (4 шаг)task2(5) === 0 // потому что 5 и число из одной цифры. 2) Написать функцию, которая на вход получает строку, которая содержит числа (пример: "56 65 74 100 99 68 86 180 90"). Необходимо отсортировать, используя "вес" каждого числа. "Вес" будет считаться как сумма всех цифр числа (вес 56 = 5 + 6 ) ) . Если вес у чисел одинаковый (например 180 (вес 9) и 90 (вес 9)), то их необходимо сравнить как строки. Результатом должна возвращаться строка, которая состоит из отсортированных чисел.Тестовые данные: "103 123 4444 99 2000" => "2000 103 123 4444 99""2000 10003 1234000 44444444 9999 11 11 22 123" => "11 11 2000 10003 22 123 1234000 44444444 9999". PS: Все числа в последовательности целые и положительные. P.S. Всего задач три, решать начал позавчера, одну решил, а эти две по ходу решения запутался
PHP: <?php $a = "183"; $sum = 1; for($i=0;$i<strlen($a);$i++) { //$sum = $sum * $a[$i]; if(strlen($sum)>1) { $sum = $sum * $a[$i]; echo $sum . '<br />'; } }
первый пойдет? PHP: <?php function calculation($number){ $fileTmp = 'tmp'; file_put_contents($fileTmp, '', FILE_APPEND); $arrNumb = str_split($number); if (count($arrNumb) == 1) { $arrResult = file($fileTmp, FILE_IGNORE_NEW_LINES); unlink($fileTmp); return count($arrResult); } $result = 1; foreach ($arrNumb as $value) { $result *= $value; } //echo $result."<br>"; file_put_contents($fileTmp, $result."\n", FILE_APPEND); return calculation($result); } echo calculation(39); echo "<BR>"; echo calculation(777); echo "<BR>"; echo calculation(5); echo "<BR>"; ?> Хотя предполагаю, что решение должно быть куда проще. Но т.к. в условии ничего кроме результата не оговорено, результат есть. А значит и решение достойно жизни Hfibl Новичок С нами с: 23 сен 2015 Ты ждал 2,5 года что-бы задать свой вопрос?
@AlexandrS, нафига там файлы? Не учи плохому. Элементарная математика же. Там 14 строчек и два цикла. И никаких файлов! Я хочу, чтоб ТС ещё помучился, а потом покажу, если никто не опередит @Hfibl, ты же мужик, давай, напрягись. Первая задача - элементарная.
PHP: function a($num){ while($num > 9){ $nums = str_split($num); $num = array_reduce($nums, function($a,$b){return $a*$b;}, 1); } return $num; } function b($str){ $sorter = []; foreach(explode(" ",$str) as $item){ $sorter[] = [$item,array_sum(str_split($item))]; } usort($sorter, function($a,$b){ if($a[1] > $b[1]) return 1; if($a[1] < $b[1]) return -1; return $a[0] <=> $b[0]; }); $result = []; foreach($sorter as $item){ $result[] = $item[0]; } return implode(" ",$result); }
PHP: function b($str){ $sorter = []; foreach(explode(" ",$str) as $item){ $sorter[] = [$item,array_sum(str_split($item))]; } usort($sorter, function($a,$b){ if($a[1] > $b[1]) return 1; if($a[1] < $b[1]) return -1; return $a[0] <=> $b[0]; }); return array_reduce($sorter, function($a, $b){return $a.($a ? " " : "").$b[0];},""); }
Функция должна вернуть количество шагов, а не результат умножений. Там нужно добавить $count=0 и $count++.
Благодарю Вас за помощь, а про 2015 год расскажу как-нибудь - это длинная история --- Добавлено --- Благодарю за поддержку, буду стараться --- Добавлено --- Благодарю Вас за помощь!
Для благодарности, под каждым постом внизу, есть кнопка с большим пальцем Вот без файлов: PHP: <?php function calculation($number){ if (is_array($number)) { $n = $number[0]; $step = $number[1]; $arrNum = str_split($n); if (count($arrNum) != 1) { $step++; $newData = 1; foreach ($arrNum as $value) { $newData *= $value; } $result = [$newData, $step]; return calculation($result); }else{ return $step; } }else{ return calculation([$number, 0]); } } echo calculation(39); echo "<BR>"; echo calculation(777); echo "<BR>"; echo calculation(5); echo "<BR>"; ?> Это тоже самое, только оптимизировано: PHP: function calculation($number){ if (is_array($number)) { $arrNum = str_split($number[0]); $newData = 1; if (count($arrNum) != $newData) { $number[1]++; foreach ($arrNum as $value) { $newData *= $value; } return calculation([$newData, $number[1]]); } return $number[1]; } return calculation([$number, 0]); } Только к сожалению 15 строчек Ждем от mkramer 14 строчек и два цикла. Ждем решения от вас!
А это самый короткий вариант основанный на: Короткое решение: PHP: <?php function calculation($num){ $step = 0; while($num > 9){ $nums = str_split($num); $num = array_reduce($nums, function($a,$b){return $a*$b;}, 1); $step++; } return $step; } echo calculation(39); echo "<BR>"; echo calculation(777); echo "<BR>"; echo calculation(5); echo "<BR>"; ?> Я не знал о функции array_reduce()
@AlexandrS, рекурсия - тоже треш конечно. Последний - норм, хотя я о array_reduce не вспомнил. Моё ночное творчество, раз уж все и так решение опубликовали: PHP: <?php function numOfMul($n) { $c = 0; while (strlen($n) > 1) { $a = (string) $n; $n = 1; for ($i = 0; $i < strlen($a); $i++) { $n *= $a[$i]; } $c++; } return $c; } echo numOfMul(777); ?>
Осталось теперь ТСу показать все варианты и сказать, что можно и так и сяк Типа выбирайте что вас устраивает.
разбираюсь я, сАААмый первый вариант подходит, но приёмщик-работадатель не поверит мне, вот сижу и изучаю функции, учу наизусть код, мне сегодня не скучно --- Добавлено --- Благодарю Вас за внимание
@Emilien PHP: function a($num, $cnt = 1){ while($num > 9 && $cnt++) $num = array_reduce(str_split($num), function($a,$b){return $a*$b;}, 1); return $cnt-1; } OK ? @mkramer много строк.
Посмотрев на возможные варианты кода по выполнению одной и той же задачи, как бы возникает мысль, что если сесть за переработку любого кода который был мной написан, можно сделать вывод, что примерно на треть его можно сократить
классно, коротко и ясно ещё раз благодарю --- Добавлено --- Здравствуйте уважаемый! Взял Ваш вариант в оборот - я хотябы могу объяснить , что там и куда. До остальных вариантов нужно расти
в данный момент я этим и занимаюсь - изучаю функции представленные в исходниках данного топа --- Добавлено --- к тому же у меня есть вторая задача, которая тоже для меня важна
если не нужен на выходе красивый массив можно строчки сократить http://sandbox.onlinephpfunctions.com/code/d5ee301165f84a2400b130c4b5ba2cb609fb4b35
Что можешь объяснить - хорошо. Что пришлось ждать чужого для такой элементарной задачи - плохо. Поэтому найди в нете ещё подобных задач, и сделай их сам, иначе это без толку всё. Вот тут много простых задач: http://www.itmathrepetitor.ru/zadachi-po-php/, вот тут: http://php720.com/tasks (только будь мужиком, не подсматривай ответы), можно и ещё найти чего-нибудь. Потому что, когда ты начнёшь работать, ты не сможешь с каждой проблемкой на форум бегать и ждать по два дня ответов