Uji apakah angka ganjil atau genap

261

Apa cara paling dasar yang paling sederhana untuk mengetahui apakah angka / variabel aneh atau bahkan dalam PHP? Apakah ada hubungannya dengan mod?

Saya sudah mencoba beberapa skrip tetapi .. google tidak memberikan saat ini.

pengguna1022585
sumber
9
mod adalah istilah singkatan umum untuk 'modulo', alias modular aritmatika
Marc B
1
Info lebih lanjut di sini termasuk: Untuk menentukan keanehan atau bahkan lebih cepat dan lebih efisien untuk menggunakan operator bitwise : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Jawaban:

557

Anda benar dalam berpikir mod adalah tempat yang baik untuk memulai. Berikut adalah ekspresi yang akan mengembalikan true jika $numbergenap, false jika ganjil:

$number % 2 == 0

Berfungsi untuk setiap nilai PHP integer , lihat juga PHP Aritmatika Operator .

Contoh:

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

Keluaran:

Bahkan

Tim Cooper
sumber
10
Jika Anda menggunakan ini dalam loop atau jumlah besar, Anda mungkin ingin mempertimbangkan bitcheck yang disarankan oleh Arius2038, yang sangat cepat. Bitcheck adalah metode pilihan saya untuk cek ganjil / genap.
Martijn
Bekerja dengan baik, tetapi saya hanya ingin tahu apa logika di balik ini? Mengapa nilai true diberikan jika "10 == 0"?
snlan
Logikanya adalah bahwa bilangan genap mana pun dapat dibagi 2 tanpa sisa. Jika Anda menggunakan $ number% 10, dan $ number Anda adalah 20, itu akan mengembalikan true, tetapi tidak jika $ number Anda adalah 22. Anda dapat menggunakan $ number% 10 jika Anda mencoba untuk menemukan setiap item ke-10 dalam satu lingkaran misalnya .
crdunst
1
@Tim, jika 5% 2 = 1. Logika adalah 2 * 2 + 1 = 5. Bagaimana cara mendapatkan 2 di php?
Hendry Tanaka
1
@ Hendry - tepatnya apa yang kamu tanyakan? Bagaimana cara mendapatkan hasil bagi divisi sebagai bilangan bulat, atau ...? Jika itu yang Anda maksud, Anda hanya perlu memberi () hasilnya; lantai (5/2) = 2
Joey Sabey
196

Pilihan lain adalah pemeriksaan bit sederhana.

n & 1

sebagai contoh:

if ( $num & 1 ) {
  //odd
} else {
  //even
}
Pawel Dubiel
sumber
1
Ini pasti akan menjadi cara tercepat ketika menggunakan bilangan bulat dalam bahasa seperti C, dengan margin besar. Adakah yang melakukan benchmark untuk menentukan apakah ini benar juga untuk PHP?
thomasrutter
1
Mungkin cara tercepat, jika mesin PHP dikodekan dengan baik.
Rolf
Saya akan mengatakan ini adalah cara tercepat dan paling lurus ke depan. Sempurna.
Robbiegod
4
Tautan di atas mati. Berikut penjelasan lain yang bagus: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir
23

Ya menggunakan mod

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

Meskipun semua jawaban itu baik dan benar, solusi sederhana dalam satu baris adalah:

$check = 9;

antara:

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

atau:

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

bekerja dengan sangat baik.

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

atau

(bool)(~ $number & 1)
Oleg
sumber
3
Saya yakin ini adalah operator bitwise, kecuali jika Anda tahu apa yang Anda lakukan dengan kemewahan itu, saya akan menghindari sintaksis ini.
danhere
1
Saya harus mengagumi sintaks, hal-hal yang bekerja tanpa mengetahui mengapa, memberi Anda pengingat betapa kecilnya kita di dunia fisika, matematika, dan, yah, tambahkan saja baris pada angka 1, bukan 2 ...
Jonas Lundman
Saya menggunakan operator bitwise di JS cukup sedikit. Misalnya if (~string.indexOf("@")) {}bukannya if (string.indexOf("@") !== -1) {}. Saya lebih suka melihat kondisi menghasilkan benar atau salah sederhana. Tapi ya, itu bisa sedikit membingungkan bagi orang yang tidak terbiasa dengan sintaks ini.
Martin James
7

Pilihan lain adalah untuk memeriksa apakah digit terakhir adalah bilangan genap:

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

Atau untuk membuatnya lebih cepat, gunakan isset()alih-alih 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
}

Atau untuk membuatnya lebih cepat ( ketukan mod operatorsesekali ):

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

Inilah tes waktu sebagai bukti atas temuan saya.

Subin
sumber
Kepada Downvoter: Bolehkah saya tahu mengapa Anda downvot?
Subin
4
Ini sangat mahal, dibandingkan dengan metode lain.
Grantwparks
@ grantwparks Nah, perbedaan antara menggunakan isset & mod hanya 0,5007 detik. Tapi, array_search sangat mahal.
Subin
2
@ grantwparks Saya telah memperbarui kode untuk menyertakan in_arrayoperator mod mana yang terkadang.
Subin
1
Cara berpikir yang menarik. Ini pada dasarnya versi desimal$num & 1 :). Anda juga bisa melakukannya heksadesimal: array (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels
5

Saya melakukan sedikit pengujian, dan menemukan bahwa antara mod, is_intdan &-operator, mod adalah yang tercepat, diikuti oleh & -operator. is_inthampir 4 kali lebih lambat dari mod.

Saya menggunakan kode berikut untuk tujuan pengujian:

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

Hasil yang saya dapatkan cukup konsisten. Berikut ini contohnya:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator
Ruben Coolen
sumber
2
di server saya (5.4.4 / cli / no opcache / i7) "&" sekitar 10% lebih cepat dari pada mod (diuji pada array dengan nilai integer acak)
Pawel Dubiel
3

Semua angka genap dibagi 2 akan menghasilkan bilangan bulat

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

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

Nol adalah angka genap. Dengan kata lain, paritasnya — kualitas bilangan bulat genap atau ganjil — adalah genap. Cara paling sederhana untuk membuktikan bahwa nol adalah genap adalah dengan mengecek apakah itu sesuai dengan definisi "genap": ini adalah kelipatan bilangan bulat dari 2, khususnya 0 × 2. Akibatnya, nol berbagi semua properti yang mencirikan angka genap: 0 dapat dibagi 2, 0 dikelilingi di kedua sisi dengan angka ganjil, 0 adalah jumlah bilangan bulat (0) dengan dirinya sendiri, dan satu set 0 objek dapat dibagi menjadi dua set yang sama. dari http://en.wikipedia.org/wiki/Parity_of_zero

sumit
sumber
1
Saya tidak mengerti. Mengapa (n + 2)% 2? Dalam kasus apa ia mengembalikan sesuatu yang berbeda dari n% 2?
Pierre-Olivier Vares
2

Kode ini memeriksa apakah angkanya aneh atau bahkan dalam PHP. Dalam contoh $aini adalah 2dan Anda mendapatkan nomor genap. Jika Anda perlu ganjil maka ubah $anilainya

$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
sumber
2

PHP mengonversi null dan string kosong secara otomatis ke nol. Itu terjadi dengan modulo juga. Karenanya akan kode

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

dengan nilai $ number = '' atau $ number = null hasilnya benar. Saya mengujinya untuk yang agak lebih panjang:

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

Fungsi ini mengembalikan 1 untuk setiap nomor ganjil, 0 untuk setiap angka genap dan false ketika bukan angka. Saya selalu menulis === benar atau === salah untuk membiarkan diri saya (dan programmer lain) tahu bahwa tes seperti yang dimaksudkan.

Loek Bergman
sumber
2

Periksa Jumlah Genap Atau Ganjil Tanpa Kondisi Penggunaan Dan Pernyataan Loop.

Ini bekerja untuk saya ..!

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

Saya membuat asumsi bahwa sudah ada counter. di $ i yang bertambah pada akhir loop, Ini bekerja untuk saya menggunakan permintaan steno.

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

Jadi apa yang dilakukan, baik itu menanyakan pernyataan yang kami buat pada dasarnya $ i adalah aneh, tergantung apakah itu benar atau salah akan memutuskan apa yang akan dikembalikan. Nilai yang dikembalikan mengisi variabel $ row_pos kami

Penggunaan saya ini adalah untuk menempatkannya di dalam foreach loop, tepat sebelum saya membutuhkannya, Ini membuatnya menjadi satu liner yang sangat efisien untuk memberi saya nama kelas yang sesuai, ini karena saya sudah memiliki penghitung untuk id untuk memanfaatkan nanti dalam program. Ini adalah contoh singkat tentang bagaimana saya akan menggunakan bagian ini.

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

Ini memberi saya kelas ganjil dan genap di setiap baris sehingga saya bisa menggunakan kelas yang benar dan menghapus hasil cetak saya di halaman.

Contoh lengkap dari apa yang saya gunakan perhatikan id memiliki penghitung diterapkan untuk itu dan kelas memiliki hasil ganjil / genap saya diterapkan padanya .:

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

Singkatnya, ini memberi saya cara yang sangat sederhana untuk membuat tabel cantik.

Chris
sumber
0

Coba ini,

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

Peringatan, untuk beberapa alasan, kondisi ini tidak mengevaluasi ke TRUE dalam deklarasi for loop , seperti yang ditunjukkan di bawah ini:

Di awal setiap iterasi, expr2dievaluasi. Jika mengevaluasi ke TRUE, loop berlanjut dan pernyataan bersarang dieksekusi. Jika mengevaluasi ke FALSE, eksekusi loop berakhir.


Ini TIDAK berfungsi:

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

Ini TIDAK berfungsi:

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

Ini TIDAK berfungsi:

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

Ini berfungsi OK :

for ($i=0; $i<count($str); $i++){
  if ($i % 2 === 1) {
    // echo "-----------\n";
  }
}
NVRM
sumber
-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';
pengguna2610558
sumber
-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
sumber
1
Apa yang ditambahkan jawaban ini sehingga jawaban yang awalnya diterima tidak?
GordonM
-1

Coba yang ini dengan bidang #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
sumber
3
Apa yang ditambahkan jawaban ini sehingga jawaban yang awalnya diterima tidak?
GordonM
dibutuhkan input dari pengguna dan mengambil keputusan atas input tersebut.
Imran Azim
Jadi tidak ada yang benar-benar.
GordonM