Пример решения. 5. Вывести цифры числа в обратном порядке
Primary tabs
Задача из этого списка
<?php
/*Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке*/
function numbers ($a)
{
echo $a, " = <br>";
$c = 1;
do {
$c *=10;
if ($a%$c < $c/10) {
echo 0, "<br>";
}
else {
echo ($a%$c - $a%($c/10)) / ($c/10), "<br>";
}
}
while ($a/$c >= 1);
}
numbers(88053);- Log in to post comments
- 26155 reads
vedro-compota
Fri, 04/21/2017 - 15:56
Permalink
просьба прокомментировать
просьба прокомментировать ключевые действия в коде.
Например, каков смысл действия
if ($a%$c < $c/10) {может быть эта проверка вообще лишняя ? Проверьте ещё раз.
_____________
матфак вгу и остальная классика =)
melisa
Fri, 04/21/2017 - 16:26
Permalink
атавизм, остался от первоначального варианта решения
проблема вывода "0" в случае отсутствия остатка от деления числа на 10/100/1000/10000 решена далее в коде
<?php /*Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке*/ function numbers ($a) { echo $a, " = <br>"; $c = 1; do { $c *=10; echo ($a%$c - $a%($c/10)) / ($c/10), "<br>"; } while ($a/$c >= 1); } numbers(35560);vedro-compota
Fri, 04/21/2017 - 15:59
Permalink
Альтернативное решение
Давайте решим другим способов, в php число это одновременно и строка, а строку можно перегнать в массив. Напишите пожалуйста альтернативное (и куда более быстрое для записи) решение с использованием перебора элементов полученного массива. Может, пригодиться и это :)
_____________
матфак вгу и остальная классика =)
melisa
Fri, 04/21/2017 - 17:18
Permalink
да, с массивом проще
<?php /*Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке*/ function transformation ($a) { echo $a, " = <br>"; $a_array = str_split ($a); $reversed_array = array_reverse ($a_array); for ($i = 0; $i < count ($reversed_array); $i++) { echo $reversed_array[$i], "<br>"; } } transformation(8560);vedro-compota
Fri, 04/21/2017 - 17:24
Permalink
foreach вместо while
для обхода массива следует использовать цикл foreach() (всегда когда возможно).
_____________
матфак вгу и остальная классика =)
melisa
Fri, 04/21/2017 - 17:52
Permalink
ещё попытка
<?php /*Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке*/ function transformation ($a) { echo $a, " = <br>"; $a_array = str_split ($a); $reversed_array = array_reverse ($a_array); foreach ($reversed_array as $k => $value) { echo $reversed_array[$k], "<br>"; } } transformation(8560);math2
Fri, 04/21/2017 - 22:30
Permalink
Нормально работает. Можно
Нормально работает. Можно сразу $value выводить
<?php /*Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке*/ function transformation ($a) { echo $a, " = <br>\n"; $a_array = str_split ($a); $reversed_array = array_reverse ($a_array); foreach ($reversed_array as $value) { echo $value, "<br>\n"; } } transformation(8560); ?>math2
Fri, 04/21/2017 - 16:26
Permalink
Можно немного сократить эту
Можно немного сократить эту программу
<?php /*Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке*/ function numbers ($a) { echo $a, " = \n"; $c = 1; do { $c *= 10; echo ($a%$c - $a%($c/10)) / ($c/10), "\n"; } while ($a/$c >= 1); } numbers(8009765);melisa
Fri, 04/21/2017 - 16:48
Permalink
спасибо, исправлено
Здесь
math2
Fri, 04/21/2017 - 17:07
Permalink
Кстати, можно переписать эту
Кстати, можно переписать эту программу, используя рекурсию:
<?php /*Дано некоторое число - вывести его цифры в обратном порядке*/ function numb ($a) { echo $a % 10 . "<BR>"; if ($a>9) { numb($a/10); } } numb(8006567);vedro-compota
Fri, 04/21/2017 - 17:43
Permalink
Или без рекурсии и проще
function fibMe($a) { while ($a>1) { echo($a % 10); // отрезаем крайнюю правую по цифру $a = $a / 10; // бере оставшуюся часть } } fibMe(8006567);_____________
матфак вгу и остальная классика =)
math2
Fri, 04/21/2017 - 22:58
Permalink
Обратил внимание, что fibMe(1
Обратил внимание, что fibMe(1) ничего не выводит. Также не будет выведена единица числа 1000.
Но функция fibMe выводит все цифры числа 10006567.
Добавил строчку в скрипт, чтобы посмотреть на $a.
<?php function fibMe($a) { while ($a>1) { echo ($a % 10)."\n"; // отрезаем крайнюю правую по цифру $a = $a / 10; // echo "a= $a \n"; } } $a = 10006567; echo ($a) . "=\n"; fibMe($a); ?>Вывод этого скрипта таков:
Дробная часть не отсекается, и поэтому последняя итерация цикла будет выполнена
по условию $1\lt 1.0006567 $.
Чтобы сделать вычисление целочисленным, можно добавить приведение к int и изменить
условие цикла на $\$a>0$.
<?php function fibMe($a) { while ($a>0) { echo ($a % 10)."\n"; // отрезаем крайнюю правую по цифру $a = (int)($a / 10); // берем оставшуюся часть echo "a= $a \n"; } } $a = 10006567; echo ($a) . "=\n"; fibMe($a); $a = 1000; echo ($a) . "=\n"; fibMe($a); ?>Теперь вывод будет таким:
math2
Fri, 04/21/2017 - 23:16
Permalink
В скрипте, указанном
В скрипте, указанном здесь
http://fkn.ktu10.com/?q=comment/1659#comment-1659
выражение $\$a/10$ может давать нецелый результат.
Здесь это проблема.
<?php /*Дано некоторое число - вывести его цифры в обратном порядке*/ function numb ($a) { echo $a % 10 . "\n"; if ($a>9) { echo "a/10= ". $a/10 ."\n"; numb( $a/10 ); } } $a = 9998732; echo $a."\n"; numb($a);Этот скрипт добавит ноль в вывод в качестве последней цифры для
числа 9998732:
Можно использовать приведение типов, или целочисленное деление intdiv, чтобы исправить эту ситуацию, и чтобы вычисление также было в целых числах:
<?php /*Дано некоторое число - вывести его цифры в обратном порядке*/ function numb ($a) { echo $a % 10 . "\n"; if ($a>9) { echo "a/10= ". intdiv($a,10). "\n"; numb(intdiv($a,10)); } } $a = 198732; echo $a."\n"; numb($a);Вывод скрипта:
melisa
Sun, 04/23/2017 - 14:53
Permalink
спасибо за дополнение!
В процессе решения, для одного из вариантов, мне сильно не хватало ф-ции intdiv. Надо было спрашивать!
math2
Fri, 04/21/2017 - 23:53
Permalink
Отмечу также, что "первый"
Отмечу также, что "первый" скрипт хорош и свободен от этих проблем.
<?php /*Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке*/ function numbers ($a) { echo $a, " = <br>"; $c = 1; do { $c *=10; echo ($a%$c - $a%($c/10)) / ($c/10), "<br>"; echo "a/c= ". ($a/$c). "<br>"; } while ($a/$c >= 1); } numbers(35560);Здесь также присутствуют нецелочисленное деление и дробные результаты:
Но это не отражается на его работе.