ทดสอบว่าเลขคี่หรือคู่


261

วิธีพื้นฐานที่ง่ายที่สุดในการตรวจสอบว่าตัวเลข / ตัวแปรแปลกหรือแม้กระทั่งใน PHP คืออะไร? มันเกี่ยวกับ mod หรือเปล่า?

ฉันได้ลองใช้สคริปต์สองสามตัว แต่ .. google ไม่แสดงในขณะนี้


9
mod เป็นคำที่จดชวเลขทั่วไปสำหรับ 'modulo', aka เลขคณิตแบบแยกส่วน
Marc B

1
ข้อมูลเพิ่มเติมที่นี่รวมถึง: เพื่อตรวจสอบคี่หรือแม้กระทั่งมันเร็วขึ้นและมีประสิทธิภาพมากขึ้นในการใช้ผู้ประกอบการระดับบิต : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

คำตอบ:


557

คุณคิดถูกแล้ว mod เป็นจุดเริ่มต้นที่ดี นี่คือการแสดงออกซึ่งจะกลับจริงถ้าเป็นจริง$numberเท็จถ้าแปลก:

$number % 2 == 0

ธิสำหรับทุกจำนวนเต็มPHPค่าโปรดดูเช่นเดียวกับเลขคณิตประกอบ PHP

ตัวอย่าง:

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

เอาท์พุท:

มันก็เป็นได้


10
หากคุณใช้สิ่งนี้ในลูปหรือในปริมาณมากคุณอาจต้องการพิจารณา bitcheck ที่ Arius2038 แนะนำซึ่งเร็วมาก Bitcheck เป็นวิธีที่ฉันชอบสำหรับการตรวจสอบคี่ / คู่
Martijn

ทำงานได้ดี แต่ฉันแค่สงสัยว่าอะไรคือเหตุผลเบื้องหลังนี้ เหตุใดจึงมีการกำหนดค่าของความจริงถ้า "10 == 0"
snlan

เหตุผลก็คือว่าจำนวนคู่ใด ๆ หารด้วย 2 ได้โดยไม่เหลือ หากคุณใช้ $ number% 10 และ $ number ของคุณคือ 20 มันจะกลับมาเป็นจริง แต่ไม่ใช่ถ้าหมายเลข $ ของคุณคือ 22 คุณสามารถใช้ $ number% 10 หากคุณพยายามค้นหาทุกรายการที่ 10 ในลูปตัวอย่างเช่น .
crdunst

1
@Tim ถ้า 5% 2 = 1 logica คือ 2 * 2 + 1 = 5. จะได้ 2 ใน php อย่างไร
Hendry Tanaka

1
@Hendry - คุณถามอะไรแน่ วิธีหาค่าหารหารด้วยจำนวนเต็มหรือ ... ถ้านั่นคือสิ่งที่คุณหมายถึงคุณจะต้องยก () ผล; floor (5/2) = 2
Joey Sabey

196

อีกทางเลือกหนึ่งคือการตรวจสอบบิตง่าย ๆ

n & 1

ตัวอย่างเช่น:

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

1
นี่จะเป็นวิธีที่เร็วที่สุดเมื่อใช้จำนวนเต็มในภาษาเช่น C โดยมีระยะขอบขนาดใหญ่ มีใครทำมาตรฐานเพื่อตรวจสอบว่าเป็นจริงสำหรับ PHP หรือไม่
thomasrutter

1
อาจเป็นวิธีที่เร็วที่สุดหากโปรแกรม PHP เขียนรหัสได้ดี
Rolf

ฉันจะบอกว่านี่เป็นวิธีที่เร็วและตรงไปตรงมาที่สุด สมบูรณ์
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
นี่คือโอเปอเรเตอร์ bitwise ที่ฉันเชื่อดังนั้นหากคุณไม่ทราบว่าคุณกำลังทำอะไรกับความแฟนซีนั้นฉันจะหลีกเลี่ยงไวยากรณ์นี้
danhere

1
ฉันต้องชื่นชมซินแท็คซ์สิ่งที่ใช้งานได้โดยไม่รู้ตัวว่าจะช่วยเตือนคุณว่าเรามีขนาดเล็กแค่ไหนในโลกของ fysics คณิตศาสตร์และก็แค่เพิ่มแถวที่ 1 ไม่ใช่ 2 ...
Jonas Lundman

ฉันใช้ตัวดำเนินการ bitwise ใน JS ค่อนข้างน้อย ตัวอย่างแทนif (~string.indexOf("@")) {} if (string.indexOf("@") !== -1) {}ฉันชอบที่จะเห็นเงื่อนไขส่งผลให้เป็นจริงหรือเท็จ แต่ใช่มันอาจสร้างความสับสนเล็กน้อยให้กับคนที่ไม่คุ้นเคยกับไวยากรณ์นี้
Martin James

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
}

นี่คือการทดสอบเวลาเป็นหลักฐานในการค้นพบของฉัน


ถึง Downvoter: ฉันขอทราบได้ไหมว่าทำไมคุณ downvote
Subin

4
มันแพงมากเมื่อเทียบกับวิธีอื่น
grantwparks

@grantwparks ความแตกต่างระหว่างการใช้isset & modเพียง 0.5007 วินาที แต่array_searchมีราคาแพงมาก
Subin

2
@grantwparks ฉันได้อัปเดตรหัสเพื่อรวมin_arrayตัวดำเนินการ mod ของ beats ซึ่งบางครั้ง
Subin

1
วิธีคิดที่น่าสนใจ มันคือเวอร์ชันทศนิยมของ$num & 1:) คุณสามารถทำได้ด้วยเลขฐานสิบหก: อาร์เรย์ (0, 2, 4, 6, 8, A, C, E, F): D
Matthijs Wessels

5

ฉันทำการทดสอบนิดหน่อยและพบว่าระหว่าง mod is_intและ&-atorator mod นั้นเร็วที่สุดตามมาด้วย & -atorator is_intช้ากว่า mod เกือบ 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 / ไม่มี opcache / i7) "&" เร็วขึ้นประมาณ 10% จากนั้น mod (ทดสอบกับอาร์เรย์ที่มีค่าจำนวนเต็มแบบสุ่ม)
Pawel Dubiel


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

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

ศูนย์คือเลขคู่ กล่าวอีกนัยหนึ่งความเท่าเทียมกันของมันคือคุณภาพของจำนวนเต็มที่เป็นเลขคี่หรือคู่ วิธีที่ง่ายที่สุดในการพิสูจน์ว่าศูนย์คือแม้กระทั่งการตรวจสอบว่ามันเหมาะกับคำจำกัดความของ "คู่": มันเป็นจำนวนเต็มคูณด้วย 2 โดยเฉพาะ 0 × 2 ดังนั้นศูนย์แบ่งปันคุณสมบัติทั้งหมดที่มีลักษณะเป็นเลขคู่: 0 คือหารด้วย 2, 0 ถูกล้อมรอบทั้งสองข้างด้วยเลขคี่, 0 คือผลรวมของจำนวนเต็ม (0) ด้วยตัวมันเองและชุดของวัตถุ 0 สามารถแบ่งออกเป็นสองชุดเท่ากัน จากhttp://en.wikipedia.org/wiki/Parity_of_zero


1
ฉันไม่เข้าใจ ทำไม (n + 2)% 2 ในกรณีใดบ้างที่ส่งคืนสิ่งที่แตกต่างจาก n% 2
Pierre-Olivier Vares

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 กำลังแปลงค่า Null และสตริงว่างให้เป็นศูนย์โดยอัตโนมัติ ที่เกิดขึ้นกับโมดูโล่เช่นกัน ดังนั้นรหัสจะ

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

ด้วยค่า $ number = '' หรือ $ number = ผลลัพธ์แบบ null จะเป็นจริง ฉันทดสอบมันเพื่อขยายค่อนข้างเพิ่มเติม:

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 สำหรับเลขคู่และใด ๆ ที่เป็นเท็จเมื่อไม่ใช่ตัวเลข ฉันมักจะเขียน === จริงหรือ === เท็จเพื่อให้ฉัน (และโปรแกรมเมอร์อื่น ๆ ) รู้ว่าการทดสอบมีวัตถุประสงค์


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 เป็นคี่ขึ้นอยู่กับว่าจริงหรือเท็จจะตัดสินใจว่าจะได้รับกลับ ค่าที่ส่งคืนจะเติมตัวแปร $ row_pos ของเรา

การใช้สิ่งนี้ของฉันคือการวางไว้ในลูป foreach ก่อนที่ฉันต้องการมันทำให้มันมีประสิทธิภาพมากในการเขียนชื่อคลาสที่เหมาะสมให้กับฉันเพราะฉันมีตัวนับสำหรับ id ของการใช้งาน ต่อมาในโปรแกรม นี่เป็นตัวอย่างสั้น ๆ ว่าฉันจะใช้ส่วนนี้อย่างไร

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

สิ่งนี้ให้ฉันแปลกและแม้กระทั่งคลาสในแต่ละแถวเพื่อให้ฉันสามารถใช้คลาสที่ถูกต้องและแถบผลลัพธ์ที่พิมพ์ของฉันลงหน้า

ตัวอย่างแบบเต็มของสิ่งที่ฉันใช้ note id มีตัวนับที่ใช้กับมันและคลาสมีผลคี่ / คู่ของฉันที่ใช้กับมัน:

$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 ในการประกาศลูปตามที่แสดงด้านล่าง:

ในการเริ่มต้นของการทำซ้ำแต่ละครั้ง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

มันจะรับอินพุตจากผู้ใช้และทำการตัดสินใจกับอินพุตนั้น
Imran Azim

ไม่มีอะไรจริงๆ
GordonM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.