Учебные задачи PHP. Задача 5

Список учебных задач PHP здесь

Условие: Дано некоторое число длиной от 1 до 5 цифр (у нас это число 3567) - вывести его цифры в обратном порядке.

Примечание: Вроде все работает при любых значениях, вот только $num можно сделать максимально 9-тизначным. Если больше, все крашится. Подскажите, почему так происходит?

<?php
$num = 3567; // задаем число
$arr = str_split($num, 1); // разбиваем на элементы как строку, с шагом 1 и формируем массив
$count = count($arr); // считаем количество элементов в массиве

$i = 1;
while ($i <= $count) { // $count применяем в качестве ограничителя по количеству интераций
	echo $num % 10, "<br>"; // выводим крайнее число - остаток от деления на 10
	$num /= 10; // число для следующей интерации
	$i++;
}
?>

Для больших чисел имеет место переполнение.

А потом это большое значение float приводится к integer.

При делении по модулю операнды приводятся к integer.

rvsokolov's picture

Спасибо за пояснение!

<?php
$num = 356799999999977777777777777777777777777777777666666666666666666666666; // задаем число
echo $num. "<br>";
echo "int  ". intval($num). "<br>";
$arr = str_split($num, 1); // разбиваем на элементы как строку, с шагом 1 и формируем массив
$count = count($arr); // считаем количество элементов в массиве
 
$i = 1;
while ($i <= $count) { // $count применяем в качестве ограничителя по количеству интераций
    echo $num % 10, "<br>"; // выводим крайнее число - остаток от деления на 10
    $num /= 10; // число для следующей интерации
    $i++;
}
?>
melisa's picture

  1. Всё работает корректно, но давайте попробуем упросить.
    $arr = str_split($num, 1); // разбиваем на элементы как строку, с шагом 1 и формируем массив
    $count = count($arr); // считаем количество элементов в массиве

    Вы создаёте массив только чтобы посчитать количество его элементов, но количество символов можно посчитать и в строке с помощью другой функции. Найдите её.

  2. $i = 1;
    while ($i <= $count) { // $count применяем в качестве ограничителя по количеству интераций
        echo $num % 10, "<br>"; // выводим крайнее число - остаток от деления на 10
        $num /= 10; // число для следующей интерации
        $i++;
    }

    В данном случае цикл опять же работает корректно, НО. Здесь нецелесообразно использование while, т.к. Вам приходится вручную инициализировать счётчик ($i = 1), и вручную же его увеличивать ($i++). За Вас это с удовольствием сделает цикл for.

    Приведите ниже исправленное решение.

    Если существуют инструменты, явно предназначенные для решения поставленной задачи, старайтесь их использовать. Если в условии не сказано иное, конечно же.

  3. Это замечательно, что Вы рассматриваете все варианты входящих значений - это очень полезно в разработке, все их видеть! :) Правда, в данной задаче количество знаков было ограничено условием: "Дано некоторое число длиной от 1 до 5 цифр"
  4. Слово итерация пишется без н
rvsokolov's picture

1 и 2. Упрощенный вариант. Действительно, так куда лучше.

<?php
$num = 3567;
$count = strlen($num);
for ($i = 1; $i <= $count; $i++) {
	echo $num % 10, "<br>";
	$num /= 10;
}
?>
Если существуют инструменты, явно предназначенные для решения поставленной задачи, старайтесь их использовать. Если в условии не сказано иное, конечно же.

В условии задачи как раз было предложено решить с помощью while.

3. Просто мне показалось, что если скрипт не работает с любым числом, значит он неправильный.

4. Правописание в слове «итерация» запомнил:)

melisa's picture

В условии задачи как раз было предложено решить с помощью while.

Не знала, я ориентировалась на условие, которое Вы обозначили в этой заметке. Тогда было всё правильно.

melisa's picture

принято