Kiểm tra xem số là số lẻ hay số chẵn


261

Cách cơ bản nhất đơn giản nhất để tìm hiểu xem một số / biến là số lẻ hay thậm chí trong PHP là gì? Nó có phải là một cái gì đó để làm với mod?

Tôi đã thử một vài tập lệnh nhưng .. hiện tại google không phân phối.


9
mod là thuật ngữ viết tắt chung cho 'modulo', còn gọi là số học mô-đun
Marc B

1
Thông tin thêm ở đây bao gồm: Để xác định số lẻ hoặc thậm chí nhanh hơn và hiệu quả hơn khi sử dụng toán tử bitwise : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Câu trả lời:


557

Bạn đã đúng khi nghĩ mod là một nơi tốt để bắt đầu. Đây là một biểu thức sẽ trả về true nếu $numberlà chẵn, sai nếu lẻ:

$number % 2 == 0

Hoạt động với mọi giá trị PHP nguyên , xem thêm Toán tử số học PHP .

Thí dụ:

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

Đầu ra:

Nó thậm chí


10
Nếu bạn sử dụng điều này trong các vòng lặp hoặc số lượng lớn, bạn có thể muốn xem xét bitcheck được đề xuất bởi Arius2038, rất nhanh. Bitcheck là phương pháp ưa thích của tôi để kiểm tra lẻ / chẵn.
Martijn

Hoạt động tốt nhưng tôi chỉ tự hỏi logic đằng sau này là gì? Tại sao giá trị của true được đưa ra nếu "10 == 0"?
snlan

Logic là bất kỳ số chẵn nào cũng chia hết cho 2 mà không có phần dư. Nếu bạn đã sử dụng $ number% 10 và số $ của bạn là 20, thì nó sẽ trả về đúng, nhưng không phải nếu số $ của bạn là 22. Bạn có thể sử dụng $ number% 10 nếu bạn đang cố gắng tìm mọi mục thứ 10 trong một vòng lặp chẳng hạn .
crdunst

1
@Tim, nếu 5% 2 = 1. Logica là 2 * 2 + 1 = 5.Làm thế nào để có được 2 trong php?
Hendry Tanaka

1
@Hendry - bạn đang hỏi chính xác điều gì? Làm cách nào để lấy thương số cho một phép chia thành một số nguyên, hoặc ...? Nếu đó là những gì bạn muốn nói, bạn chỉ cần kết quả () kết quả; sàn (5/2) = 2
Joey Sabey 20/03/2015

196

Một lựa chọn khác là kiểm tra bit đơn giản.

n & 1

ví dụ:

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

1
Đây chắc chắn sẽ là cách nhanh nhất khi sử dụng các số nguyên trong một ngôn ngữ như C, với biên độ lớn. Có ai đã thực hiện các tiêu chuẩn để xác định xem điều này có đúng với PHP không?
thomasrutter

1
Đây có lẽ là cách nhanh nhất, nếu công cụ PHP được mã hóa tốt.
Rolf

Tôi muốn nói rằng đây là cách nhanh nhất và thẳng nhất. Hoàn hảo.
Robbiegod

4
Liên kết trên là chết. Đây là một lời giải thích tốt khác: catonmat.net/blog/low-level-bit-hacks-you-absolTHER-must-ledge
kasimir

23

Có sử dụng mod

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

8

Mặc dù tất cả các câu trả lời đều tốt và đúng, nhưng giải pháp đơn giản trong một dòng là:

$check = 9;

hoặc:

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

hoặc là:

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

hoạt động rất tốt


7
(bool)($number & 1)

hoặc là

(bool)(~ $number & 1)

3
Đây là một toán tử bitwise tôi tin như vậy trừ khi bạn biết bạn đang làm gì với sự lạ mắt đó, tôi sẽ tránh cú pháp này.
danhere

1
Tôi phải ngưỡng mộ cú pháp, những thứ hoạt động mà không hiểu tại sao, cho bạn một lời nhắc nhở về việc chúng ta nhỏ bé như thế nào trong thế giới vật lý, toán học và, tốt, chỉ cần thêm một hàng vào số 1, không phải 2 ...
Jonas Lundman

Tôi sử dụng các toán tử bitwise trong JS khá một chút. Ví dụ if (~string.indexOf("@")) {}thay vì if (string.indexOf("@") !== -1) {}. Tôi thích nhìn thấy các điều kiện dẫn đến một sự thật đơn giản hoặc sai. Nhưng vâng, nó có thể hơi khó hiểu với những người không quen với cú pháp này.
Martin James

7

Một tùy chọn khác là kiểm tra xem chữ số cuối cùng có phải là số chẵn hay không:

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

Hoặc để làm cho nó nhanh hơn, sử dụng isset()thay vì 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
}

Hoặc để làm cho nó nhanh hơn ( nhịp đập mod operatornhiều lần ):

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

Đây là bài kiểm tra thời gian như một bằng chứng cho những phát hiện của tôi.


To Downvoter: Tôi có thể biết lý do tại sao bạn hạ cấp?
Subin

4
Nó rất tốn kém, so với các phương pháp khác.
Grantwparks

@grantwparks Chà, sự khác biệt giữa việc sử dụng isset & mod chỉ là 0,5007 giây. Nhưng, mảng_search rất tốn kém.
Subin

2
@grantwparks Tôi đã cập nhật mã để bao gồm in_arraytoán tử mod beats đôi khi.
Subin

1
Cách suy nghĩ thú vị mặc dù. Về cơ bản, đây là phiên bản thập phân của $num & 1:). Bạn cũng có thể thực hiện nó thập lục phân: mảng (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels

5

Tôi đã làm một chút thử nghiệm và thấy rằng giữa mod is_int&-operator, mod là nhanh nhất, theo sát bởi & -operator. is_intchậm hơn mod gần 4 lần.

Tôi đã sử dụng mã sau đây cho mục đích thử nghiệm:

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

Kết quả tôi nhận được khá nhất quán. Đây là một mẫu:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator

2
trên máy chủ của tôi (5.4.4 / cli / no opcache / i7), "&" nhanh hơn khoảng 10% sau đó mod (được thử nghiệm trên mảng với các giá trị số nguyên ngẫu nhiên)
Pawel Dubiel

3

Tất cả các số chẵn chia cho 2 sẽ dẫn đến một số nguyên

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

Số không là số chẵn. Nói cách khác, tính chẵn lẻ của nó là chất lượng của một số nguyên chẵn hoặc lẻ lẻ là chẵn. Cách đơn giản nhất để chứng minh rằng số 0 chẵn là kiểm tra xem nó có phù hợp với định nghĩa của "chẵn" không: nó là bội số nguyên của 2, cụ thể là 0 × 2. Kết quả là zero chia sẻ tất cả các thuộc tính đặc trưng cho các số chẵn: 0 chia hết cho 2, 0 được bao quanh hai bên bởi các số lẻ, 0 là tổng của một số nguyên (0) với chính nó và một tập hợp các đối tượng 0 có thể được chia thành hai tập bằng nhau. từ http://en.wikipedia.org/wiki/Parity_of_zero


1
Tôi không hiểu Tại sao (n + 2)% 2? Trong trường hợp nào nó trả về một cái gì đó khác với n% 2?
Pierre-Olivier Vares

2

Mã này kiểm tra xem số đó là số lẻ hay thậm chí trong PHP. Trong ví dụ $a2và bạn nhận được số chẵn. Nếu bạn cần lẻ thì thay đổi $agiá trị

$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 đang chuyển đổi null và một chuỗi rỗng tự động thành số không. Điều đó cũng xảy ra với modulo. Mã sẽ

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

với giá trị $ number = '' hoặc $ number = null kết quả là đúng. Tôi kiểm tra nó cho phần nào mở rộng hơn:

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

Hàm này trả về 1 cho bất kỳ số lẻ nào, 0 cho bất kỳ số chẵn nào và sai khi nó không phải là số. Tôi luôn viết === đúng hoặc === sai để cho bản thân tôi (và các lập trình viên khác) biết rằng bài kiểm tra đúng như dự định.


2

Kiểm tra số chẵn hoặc số lẻ mà không sử dụng điều kiện và báo cáo vòng lặp.

Công việc này đối với tôi ..!

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

Tôi đang đưa ra một giả định rằng đã có một bộ đếm. trong $ i được tăng lên ở cuối vòng lặp, Điều này hoạt động với tôi bằng cách sử dụng truy vấn tốc ký.

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

Vì vậy, điều này làm gì, nó truy vấn câu lệnh mà chúng ta đang thực hiện $ i là số lẻ, tùy thuộc vào việc nó đúng hay sai sẽ quyết định điều gì được trả về. Giá trị được trả về cư trú biến $ row_pose của chúng tôi

Việc sử dụng của tôi là đặt nó bên trong vòng lặp foreach, ngay trước khi tôi cần, Điều này làm cho nó trở thành một lớp lót rất hiệu quả để cung cấp cho tôi các tên lớp thích hợp, điều này là do tôi đã có một bộ đếm để id sử dụng sau đó trong chương trình. Đây là một ví dụ ngắn gọn về cách tôi sẽ sử dụng phần này.

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

Điều này mang lại cho tôi các lớp lẻ và chẵn trên mỗi hàng để tôi có thể sử dụng đúng lớp và đánh dấu các kết quả được in của tôi xuống trang.

Ví dụ đầy đủ về những gì tôi sử dụng lưu ý id có bộ đếm được áp dụng cho nó và lớp có kết quả lẻ / chẵn của tôi được áp dụng cho nó.:

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

Tóm lại, điều này cho tôi một cách rất đơn giản để tạo ra một bảng đẹp.


0

Thử cái này,

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

0

Cảnh báo, vì một số lý do, điều kiện này không đánh giá thành TRUE trong khai báo vòng lặp for , như hiển thị bên dưới:

Vào đầu mỗi lần lặp, expr2được đánh giá. Nếu nó ước lượng thành TRUE, vòng lặp tiếp tục và (các) câu lệnh lồng nhau được thực thi. Nếu nó ước tính thành FALSE, việc thực hiện vòng lặp kết thúc.


Điều này KHÔNG hoạt động:

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

Điều này KHÔNG hoạt động:

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

Điều này KHÔNG hoạt động:

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

Điều này hoạt động tốt :

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
Câu trả lời này thêm gì mà câu trả lời được chấp nhận ban đầu không?
GordonM

-1

Hãy thử cái này với trường #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
Câu trả lời này thêm gì mà câu trả lời được chấp nhận ban đầu không?
GordonM

nó lấy đầu vào từ người dùng và đưa ra quyết định về đầu vào đó.
Imran Azim

Vì vậy, không có gì thực sự.
GordonM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.