• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Kauperwood
  • Дата начала
K

Kauperwood

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

1ive

Мой вариант))

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

typak

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

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

print_r($arr);
 
1

1ive

Никогда не думал, что скажу это, но typak меня уделал))))
 
A

acorn

Какие-то у вас адские алгоритмы...

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

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

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

1ive

Немного укоротил свой, но принцип тот же.

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";
}
 
P

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

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

1ive

Наши методы решения "через строки" предусматривают наличие в массиве нецелых чисел.

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


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

parus

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

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

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

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

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

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";
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!