Sprawdź, czy liczba jest nieparzysta czy parzysta


261

Jaki jest najprostszy i najbardziej podstawowy sposób sprawdzenia, czy liczba / zmienna jest nieparzysta, a nawet w PHP? Czy to ma coś wspólnego z modem?

Wypróbowałem kilka skryptów, ale .. google obecnie nie dostarcza.


9
mod to ogólny skrót określający „modulo”, inaczej arytmetyka modularna
Marc B

1
Więcej informacji tutaj, w tym: Aby określić nieparzyste lub nawet szybsze i bardziej wydajne użycie operatora bitowego : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Odpowiedzi:


557

Miałeś rację, myśląc, że mod to dobre miejsce na start. Oto wyrażenie, które zwróci true, jeśli $numberjest parzyste, false, jeśli nieparzyste:

$number % 2 == 0

Działa z każdą liczbą całkowitą PHP , zobacz także PHP Operatory arytmetyczne .

Przykład:

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

Wynik:

Jest nawet


10
Jeśli używasz tego w pętlach lub dużych ilościach, możesz rozważyć kontrolę bitów sugerowaną przez Arius2038, która jest bardzo szybka. Kontrola bitów jest moją preferowaną metodą kontroli nieparzystych / parzystych.
Martijn

Działa dobrze, ale zastanawiam się, jaka jest logika? Dlaczego podano wartość true, jeśli „10 == 0”?
snlan

Logika jest taka, że ​​dowolna liczba parzysta jest podzielna przez 2 bez reszty. Jeśli użyjesz $ numer% 10, a twój numer $ 20, zwróci wartość true, ale nie, jeśli Twój numer $ to 22. Możesz użyć $ numer% 10, jeśli na przykład próbujesz znaleźć co 10. element w pętli .
crdunst

1
@Tim, jeśli 5% 2 = 1. Logika to 2 * 2 + 1 = 5.Jak zdobyć 2 w php?
Hendry Tanaka

1
@Hendry - o co dokładnie pytasz? Jak uzyskać iloraz dzielenia jako liczby całkowitej lub ...? Jeśli o to ci chodzi, po prostu musisz floor () uzyskać wynik; piętro (5/2) = 2
Joey Sabey

196

Inną opcją jest proste sprawdzenie bitów.

n & 1

na przykład:

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

1
Byłby to zdecydowanie najszybszy sposób przy użyciu liczb całkowitych w języku takim jak C, z dużym marginesem. Czy ktoś zrobił testy porównawcze, aby ustalić, czy dotyczy to również PHP?
thomasrutter,

1
Jest to prawdopodobnie najszybszy sposób, jeśli silnik PHP jest dobrze zakodowany.
Rolf,

Powiedziałbym, że jest to najszybszy i najprostszy sposób. Idealny.
Robbiegod

4
Powyższy link jest martwy. Oto kolejne dobre wytłumaczenie: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir

23

Tak, używając mod

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

8

Chociaż wszystkie odpowiedzi są poprawne i poprawne, proste rozwiązanie w jednym wierszu to:

$check = 9;

zarówno:

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

lub:

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

działa bardzo dobrze.


7
(bool)($number & 1)

lub

(bool)(~ $number & 1)

3
Uważam, że jest to operator bitowy, chyba że wiesz, co robisz z tą fantazją, unikałbym tej składni.
danhere 12.12.13

1
Muszę podziwiać składnię, rzeczy, które działają bez wiedzy dlaczego, przypominają o tym, jak mali jesteśmy w świecie fizyki, matematyki i, no cóż, po prostu dodaj wiersz numer 1, a nie 2 ...
Jonas Lundman

Często używam operatorów bitowych w JS. Na przykład if (~string.indexOf("@")) {}zamiast if (string.indexOf("@") !== -1) {}. Wolę, aby warunki skutkowały prostą prawdą lub fałszem. Ale tak, może to być nieco mylące dla osób, które nie znają tej składni.
Martin James

7

Inną opcją jest sprawdzenie, czy ostatnia cyfra jest liczbą parzystą:

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

Lub, aby przyspieszyć, użyj isset()zamiast 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
}

Lub, aby przyspieszyć ( czasami bijemod operator ):

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

Oto próba czasu jako dowód moich ustaleń.


Do Downvoter: Czy mogę wiedzieć, dlaczego przegłosowałeś?
Subin

4
Jest bardzo drogi w porównaniu do innych metod.
grantwparks

@grantwparks Cóż, różnica między używaniem isset i mod wynosi tylko 0,5007 sekundy. Ale array_search jest bardzo drogi.
Subin

2
@grantwparks Mam aktualizację kodu, aby uwzględnić in_arrayczasami, który operator modów bije.
Subin

1
Ciekawy sposób myślenia. Jest to w zasadzie wersja dziesiętna $num & 1:). Można to również zrobić szesnastkowo: tablica (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels

5

Zrobiłem trochę testów i okazało się, że między modem is_inta &operatorem mod jest najszybszy, a tuż za nim znajduje się & -operator. is_intjest prawie 4 razy wolniejszy niż mod.

Użyłem następującego kodu do celów testowych:

$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>";

Wyniki, które uzyskałem, były dość spójne. Oto próbka:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator

2
na moim serwerze (5.4.4 / cli / no opcache / i7) „&” jest około 10% szybszy niż mod (testowany na tablicy z losowymi liczbami całkowitymi)
Paweł Dubiel

3

Wszystkie liczby parzyste podzielone przez 2 dadzą liczbę całkowitą

$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
}

Zero to liczba parzysta. Innymi słowy, jego parzystość - jakość liczby całkowitej równej lub nieparzystej - jest parzysta. Najprostszym sposobem udowodnienia, że ​​zero jest parzyste, jest sprawdzenie, czy pasuje ono do definicji „parzystej”: jest to liczba całkowita wielokrotności 2, a konkretnie 0 × 2. W rezultacie zero dzieli wszystkie właściwości, które charakteryzują liczby parzyste: 0 jest podzielny przez 2, 0 jest otoczony z obu stron liczbami nieparzystymi, 0 jest sumą liczby całkowitej (0) z samym sobą, a zbiór 0 obiektów można podzielić na dwa równe zestawy. z http://en.wikipedia.org/wiki/Parity_of_zero


1
Nie rozumiem. Dlaczego (n + 2)% 2? W jakich przypadkach zwraca coś innego niż n% 2?
Pierre-Olivier Vares,

2

Ten kod sprawdza, czy liczba jest nieparzysta, czy nawet w PHP. W tym przykładzie $ajest 2i masz parzystą liczbę. Jeśli potrzebujesz wartości nieparzystej, zmień $awartość

$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 automatycznie konwertuje wartość null i pusty ciąg znaków na zero. Tak dzieje się również w przypadku modulo. Do tego będzie kod

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

z wartością $ number = '' lub $ number = null wynikiem jest prawda. Testuję go więc nieco bardziej:

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

Ta funkcja zwraca 1 dla dowolnej liczby nieparzystej, 0 dla dowolnej liczby parzystej i fałsz, gdy nie jest liczbą. Zawsze piszę === prawda lub === fałsz, aby dać sobie (i innym programistom) informację, że test jest zgodny z przeznaczeniem.


2

Sprawdź parzystą lub nieparzystą liczbę bez użycia warunku i instrukcji pętli.

Ta praca dla mnie ..!

$(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

Zakładam, że istnieje już licznik. w $ i, który jest zwiększany na końcu pętli, Działa to dla mnie przy użyciu skróconego zapytania.

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

Więc co to robi, cóż, pyta o to, co robimy, w istocie $ i jest dziwne, w zależności od tego, czy jego prawda, czy fałsz decyduje o tym, co zostanie zwrócone. Zwrócona wartość wypełnia naszą zmienną $ row_pos

Używam tego, aby umieścić go w pętli foreach, tuż przed jego potrzebą. To sprawia, że ​​jest to bardzo wydajny jeden liniowiec, który nadaje mi odpowiednie nazwy klas, ponieważ mam już licznik, z którego id może korzystać później w programie. To jest krótki przykład tego, jak wykorzystam tę część.

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

Daje mi to nieparzyste i parzyste klasy w każdym rzędzie, dzięki czemu mogę użyć odpowiedniej klasy i rozłożyć wydrukowane wyniki na stronie.

Pełny przykład tego, czego używam, zwróć uwagę, że identyfikator ma do niego zastosowany licznik, a klasa ma do niego mój wynik nieparzysty / parzysty:

$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++;
}

Podsumowując, daje mi to bardzo prosty sposób na stworzenie ładnego stołu.


0

Spróbuj tego,

$number = 10;
 switch ($number%2)
 {
 case 0:
 echo "It's even";
 break;
 default:
 echo "It's odd";
 }

0

Ostrzeżenie, z niektórych powodów, warunek ten nie ma wartości PRAWDA w deklaracji pętli for , jak pokazano poniżej:

Na początku każdej iteracji expr2jest oceniany. Jeśli ma wartość PRAWDA, pętla jest kontynuowana i wykonywane są instrukcje zagnieżdżone. Jeśli ma wartość FAŁSZ, wykonywanie pętli kończy się.


To NIE działa:

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

To NIE działa:

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

To NIE działa:

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

Działa to OK :

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
Co ta odpowiedź dodaje, że pierwotnie zaakceptowana odpowiedź nie?
GordonM,

-1

Wypróbuj ten z polem #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
Co ta odpowiedź dodaje, że pierwotnie zaakceptowana odpowiedź nie?
GordonM,

pobiera dane wejściowe od użytkownika i podejmuje decyzję na podstawie tych danych.
Imran Azim,

Więc nic naprawdę.
GordonM,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.