найти все числа оканчивающиеся N числом

Тема в разделе "PHP программирование", создана пользователем Kauperwood, 17 фев 2011.

  1. Kauperwood

    Kauperwood Гость

    Маленький вопрос, подскажите пожалуйста как найти все числа оканчивающиеся N числом? Например найти среди 1000 чисел все числа оканчивающиеся на 2.
     
  2. 1ive

    1ive Well-Known Member
    Web Team

    Регистрация:
    12 сен 2010
    Сообщения:
    694
    Симпатии:
    0
    Мой вариант))

    Код (PHP):
    $data = array(4124517,12347,124124,1241247); // массив с числами
    $N = "7"; // каким должен быть последний символ

    foreach ($data as $datas){
    $lastrow = strlen($datas) - 1;
    if (substr($datas, $lastrow, 1) == $N)
    {$arr[] = $datas;}}
    print_r($arr);
     
  3. typak

    typak Гость

    И можно так еще:
    Код (Text):
    $data = array(123214124124517,12347,124124,1241247); // массив с числами
    $N = "7"; // каким должен быть последний символ

    foreach ($data as $datas)
    {
    if(preg_match("|".$N."$|i", $datas))
    $arr[]=$datas;
    }

    print_r($arr);
     
  4. 1ive

    1ive Well-Known Member
    Web Team

    Регистрация:
    12 сен 2010
    Сообщения:
    694
    Симпатии:
    0
    Никогда не думал, что скажу это, но typak меня уделал))))
     
  5. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    Какие-то у вас адские алгоритмы...

    Взяв за основу алгоритм 1ive получил:

    Код (PHP):
    $data = array(4124517,12347,124124,1241247); // массив с числами
    $N = "7"; // каким должен быть последний символ

    foreach ($data as $s)
    {
    if ($N == $s[strlen($s)-1])
    echo $s . "<br />";
    }
     
  6. 1ive

    1ive Well-Known Member
    Web Team

    Регистрация:
    12 сен 2010
    Сообщения:
    694
    Симпатии:
    0
    Немного укоротил свой, но принцип тот же.

    Код (PHP):
    $data = array(4124517,12347,124124,1241247); // массив с числами
    $N = "7"; // каким должен быть последний символ

    foreach ($data as $x)
    {
    if (substr($x,strlen($x)-1,1) == $N)
    print $x . "\r\n";
    }
     
  7. Kauperwood

    Kauperwood Гость

    Крюто!!
     
  8. parus

    parus Гость

    Хмм.. это называется "Крюто"? По-моему в корне неверно решать числовую задачу через строки.
    Вот логичное и простое решение задачи:

    Код (PHP):
    $N = 7;
    for ($number=1; $number<=1000; ++$number) {
    if ($number%10==$N) {
    echo $number.' ';
    }
    }
    Остаток от деления числа на 10 всегда даст его последнюю цифру.


    А главное - это намного быстрее чем делать это же через строки (операции со строками одни из наиболее медленных).
    Ну и конечно же не через регулярные выражения!

    Интереса ради написал бенчмарк по предложенным способам:
    Код (PHP):
    for ($method=1; $method<=5; ++$method) {   
    $N = 7;

    $results = array();

    if ($method==1) {
    $start_time = microtime(true);
    for ($number=1; $number<=1000000; ++$number) {
    if ($number%10==$N) {
    $results[] = $number;
    }
    }
    $end_time = microtime(true);
    } elseif ($method==2) {
    $start_time = microtime(true);
    for ($number=1; $number<=1000000; ++$number) {
    if ($N == $number[strlen($number)-1]) {
    $results[] = $number;
    }
    }
    $end_time = microtime(true);
    } elseif ($method==3) {
    $start_time = microtime(true);
    for ($number=1; $number<=1000000; ++$number) {
    if (substr($number,strlen($number)-1,1) == $N) {
    $results[] = $number;
    }
    }
    $end_time = microtime(true);
    } elseif ($method==4) {
    $start_time = microtime(true);
    for ($number=1; $number<=1000000; ++$number) {
    if(preg_match("|".$N."$|i", $number)) {
    $results[] = $number;
    }
    }
    $end_time = microtime(true);
    } elseif ($method==5) {
    $start_time = microtime(true);
    for ($number=1; $number<=1000000; ++$number) {
    $lastrow = strlen($number) - 1;
    if (substr($number, $lastrow, 1) == $N) {
    $results[] = $number;
    }
    }
    $end_time = microtime(true);
    }


    $passes_time = $end_time-$start_time;

    echo 'METHOD '.$method.', PASSED: '.$passes_time.'<br/>';
    }
    У меня вышел такой результат по времени:
    METHOD 1, PASSED: 0.2779860496521
    METHOD 2, PASSED: 0.89392304420471
    METHOD 3, PASSED: 2.0214779376984
    METHOD 4, PASSED: 2.3823208808899
    METHOD 5, PASSED: 2.0064539909363

    Как видно числовой метод быстрее в разы.
     
  9. 1ive

    1ive Well-Known Member
    Web Team

    Регистрация:
    12 сен 2010
    Сообщения:
    694
    Симпатии:
    0
    Наши методы решения "через строки" предусматривают наличие в массиве нецелых чисел.

    Остаток от деления числа на 10 НЕ всегда даст его последнюю цифру.
    1.2337 / 10 = 0.12337 ("остаток от деления" = 12337)


    Скорость - важно, универсальность - важнее)
     
  10. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    в корне неверно привязываться к типам в PHP решая универскую задачу. :mellow:
     
  11. 1ive

    1ive Well-Known Member
    Web Team

    Регистрация:
    12 сен 2010
    Сообщения:
    694
    Симпатии:
    0
    Acorn
    +1 :mellow:
     
  12. parus

    parus Гость

    Эх, разбаловала вас нестрогая типизация в PHP..

    1. Остаток от деления 1.2337 на 10 = 1. что грубо говоря соответствует заданию, т.к. дробная часть - это дробная часть..

    2. Я бы не торопился называть решения со строками 100% универсальными. Угадайте что выдаст следующий код:
    Код (PHP):
    $number = 100000000000000;
    echo substr($number,strlen($number)-1,1);
    А выведет он "4"! Т.к. указанное выше число будет представлено как "1.0E+14"

    Для универского задания это, возможно, и несущественно, но когда вы его закончите и столкнётесь с реальными задачами и тогда что - уже можно начинать думать? :mellow: Почему бы сразу не учиться делать всё как надо?
    На высоконагруженных сайтах миллисекунды стоят денег т.к. умножаются на количество пользователей обращающихся в данный момент к серверу.

    Справедливости ради отмечу что в примере с нефиксированной дробью (когда нужна цифра именно из дробной части) вариант со строками, пожалуй, единственно возможный, т.к. при операциях с дробями точность теряется и можно получитить совсем другие числа. Вообще, в реальных задачах, конечно, прежде чего нужно смотреть зачем это вообще нужно и соответственно адаптировать решение.
     
  13. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    не смешите меня... в вашем случае
    Код (PHP):
    $number = 100000000000000;
    echo $number % 10;
    выводит 2 :)
     
  14. Kauperwood

    Kauperwood Гость

    2 число находит, а первое что передано из файла нет
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">2</div></div><div class="sp-body"><div class="sp-content">
    Код (PHP):
    $countered ="logs/count.txt";
    if (!is_file($countered))
    {
    die("<b>404 File not found!</b>");
    }
    $lines =fopen("logs/count.txt", "r");

    $nado =fread($lines,filesize($countered));

    $data =array($nado, 526263);

    $N = "3";
    foreach ($data as $x)
    {
    if (substr($x,strlen($x)-1,1) == $N){

    print $x . "человека". "\r\n";}
    else
    print $x . "человек". "\r\n";
    }
     
Загрузка...

Поделиться этой страницей