Пример решения. 5. Вывести цифры числа в обратном порядке

Задача из этого списка

<?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);

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

просьба прокомментировать ключевые действия в коде.

Например, каков смысл действия

if ($a%$c < $c/10) {

может быть эта проверка вообще лишняя ? Проверьте ещё раз.

_____________
матфак вгу и остальная классика =)

melisa's picture

проблема вывода "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's picture

Давайте решим другим способов, в php число это одновременно и строка, а строку можно перегнать в массив. Напишите пожалуйста альтернативное (и куда более быстрое для записи) решение с использованием перебора элементов полученного массива. Может, пригодиться и это :)

_____________
матфак вгу и остальная классика =)

melisa's picture

<?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's picture

для обхода массива следует использовать цикл foreach() (всегда когда возможно).

_____________
матфак вгу и остальная классика =)

melisa's picture

<?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);

Нормально работает. Можно сразу $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);
?>

Можно немного сократить эту программу

<?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's picture

Кстати, можно переписать эту программу, используя рекурсию:

<?php
/*Дано некоторое число - вывести его цифры в обратном порядке*/

function numb ($a) {
    echo $a % 10 . "<BR>";
    if ($a>9) {
        numb($a/10);
    }
}

numb(8006567);
vedro-compota's picture

function fibMe($a) {
    while ($a>1) {
        echo($a % 10); // отрезаем крайнюю правую по цифру
        $a = $a / 10; // бере оставшуюся часть
    }
}
 
fibMe(8006567);

_____________
матфак вгу и остальная классика =)

Обратил внимание, что 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);
?>

Вывод этого скрипта таков:

10006567=
7
a= 1000656.7 
6
a= 100065.67 
5
a= 10006.567 
6
a= 1000.6567 
0
a= 100.06567 
0
a= 10.006567 
0
a= 1.0006567 
1
a= 0.10006567 

Дробная часть не отсекается, и поэтому последняя итерация цикла будет выполнена
по условию $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);
?>

Теперь вывод будет таким:

10006567=
7
a= 1000656 
6
a= 100065 
5
a= 10006 
6
a= 1000 
0
a= 100 
0
a= 10 
0
a= 1 
1
a= 0 
1000=
0
a= 100 
0
a= 10 
0
a= 1 
1
a= 0 

В скрипте, указанном здесь
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:

9998732
2
a/10= 999873.2
3
a/10= 99987.32
7
a/10= 9998.732
8
a/10= 999.8732
9
a/10= 99.98732
9
a/10= 9.998732
9
a/10= 0.9998732
0

Можно использовать приведение типов, или целочисленное деление 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);

Вывод скрипта:

198732
2
a/10= 19873
3
a/10= 1987
7
a/10= 198
8
a/10= 19
9
a/10= 1
1
melisa's picture

В процессе решения, для одного из вариантов, мне сильно не хватало ф-ции intdiv. Надо было спрашивать!

Отмечу также, что "первый" скрипт хорош и свободен от этих проблем.

<?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);

Здесь также присутствуют нецелочисленное деление и дробные результаты:

35560 = 
0
a/c= 3556
6
a/c= 355.6
5
a/c= 35.56
5
a/c= 3.556
3
a/c= 0.3556

Но это не отражается на его работе.