Testen Sie, ob die Zahl ungerade oder gerade ist

261

Was ist der einfachste und einfachste Weg, um herauszufinden, ob eine Zahl / Variable in PHP ungerade oder gerade ist? Hat das etwas mit Mod zu tun?

Ich habe ein paar Skripte ausprobiert, aber Google liefert im Moment nicht.

user1022585
quelle
9
mod ist die allgemeine Abkürzung für 'modulo', auch bekannt als modulare Arithmetik
Marc B
1
Weitere Informationen hier einschließlich: Um ungerade oder gerade zu bestimmen, ist es schneller und effizienter, den bitweisen Operator zu verwenden : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Antworten:

557

Du hast zu Recht gedacht, dass Mod ein guter Anfang ist. Hier ist ein Ausdruck, der true zurückgibt, wenn gerade $numberist, false, wenn ungerade:

$number % 2 == 0

Funktioniert für jeden ganzzahligen PHP- Wert, siehe auch Arithmetic Operators PHP .

Beispiel:

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

Ausgabe:

Es ist gerade

Tim Cooper
quelle
10
Wenn Sie dies in Schleifen oder großen Mengen verwenden, sollten Sie den von Arius2038 vorgeschlagenen Bitcheck in Betracht ziehen, der sehr schnell ist. Der Bitcheck ist meine bevorzugte Methode für ungerade / gerade Prüfungen.
Martijn
Funktioniert gut, aber ich frage mich nur, was die Logik dahinter ist. Warum wird bei "10 == 0" der Wert true angegeben?
Snlan
Die Logik ist, dass jede gerade Zahl ohne Rest durch 2 teilbar ist. Wenn Sie $ number% 10 verwendet haben und Ihre $ number 20 war, würde dies true zurückgeben, aber nicht, wenn Ihre $ number 22 wäre. Sie könnten $ number% 10 verwenden, wenn Sie beispielsweise versuchen würden, jedes 10. Element in einer Schleife zu finden .
Crdunst
1
@Tim, wenn 5% 2 = 1. Die Logik ist 2 * 2 + 1 = 5. Wie bekomme ich die 2 in PHP?
Hendry Tanaka
1
@Hendry - was fragst du genau? Wie erhalte ich den Quotienten für eine Division als ganze Zahl oder ...? Wenn Sie das meinen, müssen Sie nur das Ergebnis auf den Boden legen (); Etage (5/2) = 2
Joey Sabey
196

Eine weitere Option ist eine einfache Bitprüfung.

n & 1

beispielsweise:

if ( $num & 1 ) {
  //odd
} else {
  //even
}
Pawel Dubiel
quelle
1
Dies wäre definitiv der schnellste Weg, wenn Sie Ganzzahlen in einer Sprache wie C mit großem Abstand verwenden. Hat jemand Benchmarks durchgeführt, um festzustellen, ob dies auch für PHP gilt?
Thomasrutter
1
Es ist wahrscheinlich der schnellste Weg, wenn die PHP-Engine gut codiert war.
Rolf
Ich würde sagen, dies ist der schnellste und direkteste Weg. Perfekt.
Robbiegod
4
Der obige Link ist tot. Hier ist eine weitere gute Erklärung: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir
23

Ja mit dem Mod

$even = ($num % 2 == 0);
$odd = ($num % 2 != 0);
Aaron W.
quelle
8

Während alle Antworten gut und richtig sind, lautet die einfache Lösung in einer Zeile:

$check = 9;

entweder:

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

oder:

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

funktioniert sehr gut.

Tarik
quelle
7
(bool)($number & 1)

oder

(bool)(~ $number & 1)
Olegs
quelle
3
Ich glaube, dies ist ein bitweiser Operator. Wenn Sie nicht wissen, was Sie mit dieser Fantasie tun, würde ich diese Syntax vermeiden.
Danhere
1
Ich muss die Syntax bewundern, Dinge, die funktionieren, ohne zu wissen warum, sie erinnern Sie daran, wie klein wir in der Welt der Fysik, Mathematik sind, und fügen Sie einfach eine Zeile zu Nummer 1 hinzu, nicht zu 2 ...
Jonas Lundman
Ich benutze bitweise Operatoren in JS ziemlich oft. Zum Beispiel if (~string.indexOf("@")) {}anstelle von if (string.indexOf("@") !== -1) {}. Ich sehe lieber, dass Bedingungen zu einem einfachen Wahr oder Falsch führen. Aber ja, es kann für Leute, die mit dieser Syntax nicht vertraut sind, etwas verwirrend sein.
Martin James
7

Eine andere Möglichkeit besteht darin, zu überprüfen, ob die letzte Ziffer eine gerade Zahl ist:

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

Oder verwenden Sie isset()anstelle von 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
}

Oder um es schneller zu machen ( schlägt mod operatormanchmal ):

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

Hier ist der Zeittest als Beweis für meine Ergebnisse.

Subin
quelle
An Downvoter: Darf ich bitte wissen, warum Sie downvotiert haben?
Subin
4
Es ist sehr teuer im Vergleich zu anderen Methoden.
Grantwparks
@grantwparks Nun, der Unterschied zwischen isset & mod beträgt nur 0,5007 Sekunden. Aber array_search ist sehr teuer.
Subin
2
@grantwparks Ich habe den Code aktualisiert, um einzuschließen, in_arraywelcher Mod-Operator manchmal schlägt.
Subin
1
Interessante Denkweise. Es ist im Grunde die Dezimalversion von $num & 1:). Sie können dies auch hexadezimal tun: Array (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels
5

Ich habe ein bisschen getestet und festgestellt, dass zwischen mod is_intund dem &-operator mod am schnellsten ist, dicht gefolgt vom & -operator. is_intist fast 4 mal langsamer als mod.

Ich habe den folgenden Code zu Testzwecken verwendet:

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

Die Ergebnisse waren ziemlich konsistent. Hier ist ein Beispiel:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator
Ruben Coolen
quelle
2
auf meinem Server (5.4.4 / cli / no opcache / i7) ist das "&" ungefähr 10% schneller als mod (getestet auf einem Array mit zufälligen ganzzahligen Werten)
Pawel Dubiel
3

Alle geraden Zahlen geteilt durch 2 ergeben eine ganze Zahl

$number = 4;
if(is_int($number/2))
{
   echo("Integer");
}
else
{
   echo("Not Integer");
}
David S.
quelle
2
//for numbers n [0,1,2,3,4....]

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

Null ist eine gerade Zahl. Mit anderen Worten, seine Parität - die Qualität einer ganzen Zahl, die gerade oder ungerade ist - ist gerade. Der einfachste Weg, um zu beweisen, dass Null gerade ist, besteht darin, zu überprüfen, ob es der Definition von "gerade" entspricht: Es ist ein ganzzahliges Vielfaches von 2, insbesondere 0 × 2. Infolgedessen teilt Null alle Eigenschaften, die gerade Zahlen charakterisieren: 0 ist durch 2 teilbar, 0 ist auf beiden Seiten von ungeraden Zahlen umgeben, 0 ist die Summe einer ganzen Zahl (0) mit sich selbst, und eine Menge von 0 Objekten kann in zwei gleiche Mengen aufgeteilt werden. von http://en.wikipedia.org/wiki/Parity_of_zero

sumit
quelle
1
Ich verstehe nicht. Warum (n + 2)% 2? In welchen Fällen wird etwas anderes als n% 2 zurückgegeben?
Pierre-Olivier Vares
2

Dieser Code prüft, ob die Zahl in PHP ungerade oder gerade ist. Im Beispiel $aist 2und Sie erhalten eine gerade Zahl. Wenn Sie ungerade benötigen, ändern Sie den $aWert

$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>";
}
Narendra Chauhan
quelle
2

PHP konvertiert null und eine leere Zeichenfolge automatisch in eine Null. Das passiert auch mit Modulo. Dafür wird der Code

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

mit dem Wert $ number = '' oder $ number = null ergibt true. Ich teste es dafür etwas länger:

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

Diese Funktion gibt 1 für eine ungerade Zahl, 0 für eine gerade Zahl und false zurück, wenn es sich nicht um eine Zahl handelt. Ich schreibe immer === wahr oder === falsch, um mich (und andere Programmierer) wissen zu lassen, dass der Test wie beabsichtigt ist.

Loek Bergman
quelle
2

Überprüfen Sie die gerade oder ungerade Zahl ohne Verwendung Bedingung und Schleifenanweisung.

Diese Arbeit für mich ..!

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

jd savaj
quelle
1

Ich gehe davon aus, dass bereits ein Zähler vorhanden ist. in $ i, das am Ende einer Schleife inkrementiert wird. Dies funktioniert bei mir mit einer Kurzabfrage.

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

Was macht das also? Nun, es fragt die Aussage ab, die wir im Wesentlichen machen. $ I ist seltsam, je nachdem, ob es wahr oder falsch ist, wird entschieden, was zurückgegeben wird. Der zurückgegebene Wert füllt unsere Variable $ row_pos

Ich verwende dies, um es in der foreach-Schleife zu platzieren, kurz bevor ich es brauche. Dies macht es zu einem sehr effizienten Einzeiler, mir die entsprechenden Klassennamen zu geben. Dies liegt daran, dass ich bereits einen Zähler habe, den die IDs verwenden können später im Programm. Dies ist ein kurzes Beispiel, wie ich diesen Teil verwenden werde.

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

Dies gibt mir ungerade und gerade Klassen in jeder Zeile, so dass ich die richtige Klasse verwenden und meine gedruckten Ergebnisse auf der Seite streifen kann.

Das vollständige Beispiel dessen, was ich benutze, ist, dass auf die ID der Zähler angewendet wird und auf die Klasse mein ungerades / gerades Ergebnis angewendet wird:

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

Zusammenfassend gibt mir dies eine sehr einfache Möglichkeit, eine hübsche Tabelle zu erstellen.

Chris
quelle
0

Versuche dies,

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

Warnung: Aus bestimmten Gründen wird diese Bedingung in einer for-Schleifendeklaration nicht als WAHR ausgewertet , wie unten gezeigt:

Zu Beginn jeder Iteration expr2wird ausgewertet. Wenn TRUE ausgewertet wird, wird die Schleife fortgesetzt und die verschachtelten Anweisungen werden ausgeführt. Wenn es als FALSE ausgewertet wird, endet die Ausführung der Schleife.


Dies funktioniert NICHT :

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

Dies funktioniert NICHT :

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

Dies funktioniert NICHT :

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

Das funktioniert OK :

for ($i=0; $i<count($str); $i++){
  if ($i % 2 === 1) {
    // echo "-----------\n";
  }
}
NVRM
quelle
-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';
user2610558
quelle
-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.";
}
Imran Azim
quelle
1
Was fügt diese Antwort hinzu, was die ursprünglich akzeptierte Antwort nicht tut?
GordonM
-1

Versuchen Sie dies mit dem Feld #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.";
    }
    }
?>
Imran Azim
quelle
3
Was fügt diese Antwort hinzu, was die ursprünglich akzeptierte Antwort nicht tut?
GordonM
Es nimmt Eingaben vom Benutzer entgegen und entscheidet über diese Eingaben.
Imran Azim
Also eigentlich nichts.
GordonM