Проверьте, является ли число нечетным или четным


262

Какой самый простой и простой способ узнать, является ли число / переменная нечетным или четным в PHP? Это как-то связано с модом?

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


9
mod - это общий сокращенный термин для «по модулю», он же модульная арифметика
Marc B

1
Более подробная информация здесь, в том числе: Чтобы определить нечетное или четное, это быстрее и эффективнее использовать побитовый оператор : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Ответы:


558

Вы были правы, думая, что мод - хорошее место для начала. Вот выражение, которое будет возвращать true, если $numberчетное, false, если нечетное:

$number % 2 == 0

Работает для каждого целочисленного значения PHP , см. Также Арифметические операторы PHP .

Пример:

$number = 20;
if ($number % 2 == 0) {
  print "It's even";
}

Вывод:

Это даже


10
Если вы используете это в циклах или больших количествах, вы можете рассмотреть проверку битов, предложенную Arius2038, которая очень быстрая. Бит-чек - мой предпочтительный метод для нечетных / четных проверок.
Мартейн

Работает нормально, но мне просто интересно, какая логика стоит за этим? Почему задано значение true, если "10 == 0"?
Snlan

Логика в том, что любое четное число делится на 2 без остатка. Если бы вы использовали $ number% 10, а ваш $ number был 20, он вернул бы true, но не если бы ваш $ number был 22. Вы могли бы использовать $ number% 10, если вы пытались найти каждый 10-й элемент в цикле, например ,
crdunst

1
@ Время, если 5% 2 = 1. Логика 2 * 2 + 1 = 5. Как получить 2 в php?
Хендри Танака

1
@Hendry - что ты спрашиваешь? Как получить частное для деления на целое число или ...? Если это то, что вы имеете в виду, вам просто нужно получить floor () результат; пол (5/2) = 2
Джои Сабей

196

Другой вариант - простая проверка битов.

n & 1

например:

if ( $num & 1 ) {
  //odd
} else {
  //even
}

1
Это определенно будет самый быстрый способ при использовании целых чисел в языке, подобном C, с большим отрывом. Кто-нибудь делал тесты, чтобы определить, верно ли это и для PHP?
Томасруттер

1
Вероятно, это самый быстрый способ, если PHP-движок был хорошо закодирован.
Рольф

Я бы сказал, что это самый быстрый и прямой путь. Отлично.
Robbiegod

4
Выше ссылка мертва. Вот еще одно хорошее объяснение: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir


8

Хотя все ответы являются хорошими и правильными, простое решение в одной строке:

$check = 9;

либо:

echo ($check & 1 ? 'Odd' : 'Even');

или:

echo ($check % 2 ? 'Odd' : 'Even');

работает очень хорошо.


7
(bool)($number & 1)

или

(bool)(~ $number & 1)

3
Я полагаю, что это побитовый оператор, если вы не знаете, что вы делаете с этой фантазией, я бы избежал этого синтаксиса.
danhere 12.12.13

1
Я должен восхищаться синтаксисом, вещи, которые работают, не зная почему, дают вам напоминание о том, насколько мы малы в мире физики, математики и, ну, просто добавим строку под номером 1, а не 2 ...
Джонас Лундман

Я использую побитовые операторы в JS совсем немного. Например if (~string.indexOf("@")) {}вместо if (string.indexOf("@") !== -1) {}. Я предпочитаю, чтобы условия приводили к простому истинному или ложному. Но да, это может немного смущать людей, которые не знакомы с этим синтаксисом.
Мартин Джеймс

7

Другой вариант - проверить, является ли последняя цифра четным числом:

$value = "1024";// A Number
$even = array(0, 2, 4, 6, 8);
if(in_array(substr($value, -1),$even)){
  // Even Number
}else{
  // Odd Number
}

Или, чтобы сделать это быстрее, используйте isset()вместо array_search:

$value = "1024";// A Number
$even = array(0 => 1, 2 => 1, 4 => 1, 6 => 1, 8 => 1);
if(isset($even[substr($value, -1)]){
  // Even Number
}else{
  // Odd Number
}

Или сделать это быстрее ( бьет mod operatorв разы ):

$even = array(0, 2, 4, 6, 8);
if(in_array(substr($number, -1),$even)){
  // Even Number
}else{
  // Odd Number
}

Вот проверка времени как доказательство моих выводов.


To Downvoter: Могу ли я узнать, почему вы проголосовали?
Субин

4
Это очень дорого по сравнению с другими методами.
grantwparks

@grantwparks Ну, разница между использованием isset & mod составляет всего 0.5007 секунд. Но array_search очень дорогой.
Субин

2
@grantwparks Я обновил код, чтобы включить, in_arrayкоторый иногда опережает мод оператора.
Субин

1
Интересный способ мышления, хотя. Это в основном десятичная версия $num & 1:). Вы также можете сделать это в шестнадцатеричном виде: массив (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels

5

Я провел небольшое тестирование и обнаружил, что между mod is_intи &-operator, mod - самый быстрый, за ним следует & -оператор. is_intпочти в 4 раза медленнее, чем мод.

Я использовал следующий код для тестирования:

$number = 13;

$before = microtime(true);
for ($i=0; $i<100000; $i++) {
    $test = ($number%2?true:false);
}
$after = microtime(true);

echo $after-$before." seconds mod<br>";

$before = microtime(true);
for ($i=0; $i<100000; $i++) {
    $test = (!is_int($number/2)?true:false);
}
$after = microtime(true);

echo $after-$before." seconds is_int<br>";

$before = microtime(true);
for ($i=0; $i<100000; $i++) {
    $test = ($number&1?true:false);
}
$after = microtime(true);

echo $after-$before." seconds & operator<br>";

Результаты, которые я получил, были довольно последовательными. Вот пример:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator

2
на моем сервере (5.4.4 / cli / no opcache / i7) «&» примерно на 10% быстрее, чем мод (проверено на массиве со случайными целочисленными значениями)
Pawel Dubiel

3

Все четные числа, разделенные на 2, приведут к целому числу

$number = 4;
if(is_int($number/2))
{
   echo("Integer");
}
else
{
   echo("Not Integer");
}

2
//for numbers n [0,1,2,3,4....]

if((n+2)%2==1) {
   //odd
}else {
  //even
}

Ноль - это четное число. Другими словами, его четность - качество целого числа, являющегося четным или нечетным, - четна. Самый простой способ доказать, что ноль является четным, состоит в том, чтобы проверить, что он соответствует определению «четного»: это целое число, кратное 2, в частности, 0 × 2. В результате ноль разделяет все свойства, которые характеризуют четные числа: делится на 2, 0 окружен с обеих сторон нечетными числами, 0 является суммой целого числа (0) с самим собой, а набор из 0 объектов может быть разбит на два равных набора. с http://en.wikipedia.org/wiki/Parity_of_zero


1
Я не понимаю Почему (n + 2)% 2? В каких случаях он возвращает что-то отличное от n% 2?
Пьер-Оливье Варес

2

Этот код проверяет, является ли число нечетным или четным в PHP. В примере $aесть 2и вы получите четное число. Если вам нужен нечетный, измените $aзначение

$a=2;
if($a %2 == 0){
    echo "<h3>This Number is <b>$a</b> Even</h3>";
}else{
    echo "<h3>This Number is <b>$a</b> Odd</h3>";
}

2

PHP автоматически преобразует ноль и пустую строку в ноль. Это происходит и по модулю. Для этого будет код

$number % 2 == 0 or !($number & 1)

со значением $ number = '' или $ number = null, результат равен true. Я проверяю это для чего-то более расширенного:

function testEven($pArg){
    if(is_int($pArg) === true){
        $p = ($pArg % 2);
        if($p== 0){
            print "The input '".$pArg."' is even.<br>";
        }else{
            print "The input '".$pArg."' is odd.<br>";
        }
    }else{
        print "The input '".$pArg."' is not a number.<br>";
    }
}

The print is there for testing purposes, hence in practice it becomes:
function testEven($pArg){
    if(is_int($pArg)=== true){
        return $pArg%2;
    }
    return false;
}

Эта функция возвращает 1 для любого нечетного числа, 0 для любого четного числа и false, если это не число. Я всегда пишу === true или === false, чтобы позволить себе (и другим программистам) знать, что тест соответствует назначению.


2

Проверьте четное или нечетное число без условия использования и оператора цикла.

Эта работа для меня ..!

$(document).ready(function(){
    $("#btn_even_odd").click(function(){
        var arr = ['Even','Odd'];
        var num_even_odd = $("#num_even_odd").val();
        $("#ans_even_odd").html(arr[num_even_odd % 2]);
    });
});
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <title>Check Even Or Odd Number Without Use Condition And Loop Statement.</title>
</head>
<body>
<h4>Check Even Or Odd Number Without Use Condition And Loop Statement.</h4>
<table>
    <tr>
        <th>Enter A Number :</th>
        <td><input type="text" name="num_even_odd" id="num_even_odd" placeholder="Enter Only Number"></td>
    </tr>
    <tr>
        <th>Your Answer Is :</th>
        <td id="ans_even_odd" style="font-size:15px;color:gray;font-weight:900;"></td>
    </tr>
    <tr>
        <td><input type="button" name="btn_even_odd" id="btn_even_odd" value="submit"></td>
    </tr>
</table>
</body>
</html>


1

Я предполагаю, что счетчик уже установлен. в $ i, который увеличивается в конце цикла, это работает для меня, используя сокращенный запрос.

$row_pos = ($i & 1) ? 'odd' : 'even';

Итак, что же это делает, он запрашивает утверждение, которое мы делаем по существу, $ i нечетно, в зависимости от того, будет ли его значение true или false решать, что будет возвращено. Возвращаемое значение заполняет нашу переменную $ row_pos

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

<div class='row-{$row_pos}'> random data <div>

Это дает мне нечетные и четные классы в каждой строке, поэтому я могу использовать правильный класс и чередовать результаты печати по странице.

Полный пример того, что я использую, отмечает, что к идентификатору применен счетчик, а к классу применен мой нечетный / четный результат:

$i=0;
foreach ($a as $k => $v) {

    $row_pos = ($i & 1) ? 'odd' : 'even';
    echo "<div id='A{$i}' class='row-{$row_pos}'>{$v['f_name']} {$v['l_name']} - {$v['amount']} - {$v['date']}</div>\n";

$i++;
}

Таким образом, это дает мне очень простой способ создать красивую таблицу.



0

Предупреждение: по некоторым причинам это условие не оценивается как TRUE в объявлении цикла for , как показано ниже:

В начале каждой итерации expr2оценивается. Если значение равно TRUE, цикл продолжается и выполняются вложенные операторы. Если он оценивается как FALSE, выполнение цикла заканчивается.


Это НЕ работает:

for ($i=0; $i % 2 === 1 && $i < count($str); $i++){
  // echo "-----------\n";
}

Это НЕ работает:

for ($i=0; ($i % 2 === 1) && $i < count($str); $i++){
  // echo "-----------\n";
}

Это НЕ работает:

for ($i=0; ($i % 2) === 1 && $i < count($str); $i++){
  // echo "-----------\n";
}

Это работает хорошо :

for ($i=0; $i<count($str); $i++){
  if ($i % 2 === 1) {
    // echo "-----------\n";
  }
}

-1
$before = microtime(true);

$n = 1000;  
$numbers = range(1,$n);

$cube_numbers = array_map('cube',$numbers);

function cube($n){      
    $msg ='even';       
    if($n%2 !=0){
        $msg = 'odd';
    }               
    return "The Number is $n is ".$msg;
}

foreach($cube_numbers as $cube){
    echo $cube . "<br/>";
}

$after = microtime(true);

echo $after-$before. 'seconds';

-1
//checking even and odd
$num =14;

$even = ($num % 2 == 0);
$odd = ($num % 2 != 0);

if($even){
    echo "Number is even.";
} else {
    echo "Number is odd.";
}

1
Что этот ответ добавляет, что первоначально принятый ответ нет?
GordonM

-1

Попробуйте это с полем #Input

<?php
    //checking even and odd
    echo '<form action="" method="post">';
    echo "<input type='text' name='num'>\n";
    echo "<button type='submit' name='submit'>Check</button>\n";
    echo "</form>";

    $num = 0;
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      if (empty($_POST["num"])) {
        $numErr = "<span style ='color: red;'>Number is required.</span>";
        echo $numErr;
        die();
      } else {
          $num = $_POST["num"];
      }


    $even = ($num % 2 == 0);
    $odd = ($num % 2 != 0);
    if ($num > 0){
        if($even){
            echo "Number is even.";
        } else {
            echo "Number is odd.";
        }
    } else {
        echo "Not a number.";
    }
    }
?>

3
Что этот ответ добавляет, что первоначально принятый ответ нет?
GordonM

он принимает входные данные от пользователя и принимает решение по этим входным данным.
Имран Азим

Так что на самом деле ничего.
GordonM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.