Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Проверить на PHP введенное число на соответствие 1, 10, 100, …, 10 000 000

#php


Как математически проверить пользовательский ввод: соответствует ли число одному
из заданной последовательности: 1, 10, 100, ..., 10 000 000 на PHP. Проверить с помощью
preg_match() - не проблема, но как-то не правильно проверять числа функцией, предназначенной
для проверки строк.

if (!preg_match('/^10{0,7}$/', $_GET['insert_number'])) {
    echo 'число должно быть 1, 10, 100, 1000 и т.д.';
}


Как назвать последовательность чисел 1, 10, ..., чтобы сообщение об ошибке было более
информативным?
    


Ответы

Ответ 1



Всего 8 вариантов, отчего бы не захардкодить? =) in_array($userInput, [1,10,100,1000,10000,100000,1000000,10000000]); Ещё странный вариант: смотреть на валидные числа как на двоичные – там ведь только единицы и нули допустимы, длиной не более байта (8 позиций). function is10x($userInput) { $input = trim($userInput); // убрать пробелы по краям и считать строкой $binStr = sprintf('%b', intval($input,2)); // перевести в двоичное число и в строку единиц и нулей if( $binStr !== $input) return FALSE; // должно пережить двойной перевод без потерь return array_sum(str_split($binStr)) === 1; // должно содержать только одну 1 } Тесты Сообщение: «Число должно начинаться с единицы и, кроме неё, может содержать только нули»

Ответ 2



Можно проверить через логарифм, но при этом нужно учитывать что функции log() и log10() всегда возвращают число типа float. Можно применить такой хак: $y = 10; $x = pow((string)log10($y),1); результат работы log10() перегоняем в строку и скармливаем функции pow(), которая выдает int или float в зависимости от полученного результата if (is_float($x) || $y < 1) echo "Число не удовлетворяет условию"; var_dump($x);

Ответ 3



Написал на Java, т.к не пользуюсь PHP //Проверка на то, является ли число одной из степеней 10: public boolean is10(int n) { if(n==1) return true; else if(n<1) return false; return n%10==0 && is10(n/10); } Ну и попытался конвертировать на PHP: function is10($n): boolean { if ($n == 1) { return true; } elseif ($n < 1) { return false; } return $n % 10 == 0 && is10($n / 10); }

Ответ 4



нельзя ли сделать простым циклом? так как максимальное число 10 000 000 // Функция проверки цисла function proveritChislo($number){ // Если число больше 1 можно работать while ( $number > 1 ) { // Если не заканчивается на 0, значит не правильно $ostatok = $number % 10; if ($ostatok != 0) { return FALSE; } // убираем последний 0 $number = ($number - $ostatok) / 10; } return $number == 1; }

Ответ 5



$test="1".str_repeat("0",strlen($input)-1); if($test % $unput != 0) echo "Ошибка бла-бла-бла";

Комментариев нет:

Отправить комментарий