测试数字是奇数还是偶数


261

找出数字/变量在PHP中是奇数还是偶数的最简单,最基本的方法是什么?与mod有关吗?

我已经尝试了一些脚本,但是.. google目前无法交付。


9
mod是“取模”(又称为模算术
Marc B

1
这里的更多信息包括: 若要确定奇数或偶数,使用按位运算符会更快,更高效 & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Answers:


557

您认为mod是一个不错的起点是正确的。这是一个表达式,如果$number是偶数,则返回true;如果是奇数,则返回false:

$number % 2 == 0

适用于每个整数PHP值,另请参见算术运算符PHP

例:

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

输出:

甚至


10
如果以循环方式或大量使用此功能,则可能需要考虑Arius2038建议的位检查,这非常快。对于奇/偶校验,我首选使用bitcheck。
马丁·

工作正常,但我只是想知道背后的逻辑是什么?如果“ 10 == 0”,为什么给出的值为true?
snlan 2014年

逻辑是任何偶数都可被2除尽而没有余数。如果您使用$ number%10,并且您的$ number是20,它将返回true,但是如果您的$ number是22,则不会返回true。例如,如果您试图在循环中查找每第10个项目,则可以使用$ number%10 。
crdunst 2014年

1
@Tim,如果5%2 = 1。逻辑是2 * 2 + 1 = 5。如何在php中获得2?
Hendry Tanaka

1
@Hendry-您到底要问什么?如何获得除数为整数的商,或...?如果这是您的意思,则只需要对结果进行floor()即可;floor(5/2)= 2
Joey Sabey 2015年

196

另一种选择是简单的位检查。

n & 1

例如:

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

1
无疑,这是在像C这样的语言中使用整数时最快的方法。有没有人做过基准测试来确定PHP是否也是如此?
thomasrutter

1
如果PHP引擎编码正确,这可能是最快的方法。
罗尔夫2013年

我想这是最快,最直接的方法。完善。
Robbiegod 2014年

4
以上链接已死。这是另一个很好的解释:catonmat.net/blog/low-level-bit-hacks-您绝对必须知道
kasimir 2015年

23

是的,使用mod

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

8

虽然所有答案都是正确的,但简单的解决方案是:

$check = 9;

要么:

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

要么:

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

效果很好。


7
(bool)($number & 1)

要么

(bool)(~ $number & 1)

3
我相信这是一个按位运算符,因此,除非您知道自己在做什么,否则我会避免使用这种语法。
danhere 2013年

1
我不得不佩服语法,这些东西在不知道为什么的情况下仍然起作用,它使您想起了我们在数学,数学世界中有多小,而且,仅在数字1上添加一行,而不是在2上增加一行
乔纳斯·隆德曼

我在JS中经常使用按位运算符。例如if (~string.indexOf("@")) {}代替if (string.indexOf("@") !== -1) {}。我更喜欢看到条件导致简单的对或错。但是,是的,这会使不熟悉此语法的人感到困惑。
马丁·詹姆斯(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:请问您为什么投票?
Subin 2014年

4
与其他方法相比,它非常昂贵。
Grantwparks 2015年

@grantwparks好吧,使用issetmod之间的差异仅为0.5007秒。但是,array_search非常昂贵。
Subin

2
@grantwparks我已经更新了代码,以包括in_array有时会跳动的mod运算符。
Subin

1
有趣的思维方式。基本上是$num & 1:) 的十进制版本。您也可以十六进制:array(0,2,4,6,8,A,C,E,F):D。
Matthijs Wessels'2

5

我做了一些测试,发现在mod is_int&-operator之间,mod是最快的,其次是&-operator。 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 / no opcache / i7),“&”比mod快大约10%(在具有随机整数值的阵列上测试)
Pawel Dubiel

3

所有偶数除以2将得出一个整数

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

零是偶数。换句话说,它的奇偶性(整数质量为偶数或奇数)为偶数。证明零为偶数的最简单方法是检查它是否符合“偶数”的定义:它是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中的数字是否为奇数或偶数。在示例$a2,您得到的是偶数。如果需要奇数,则更改$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的结果为true。为此,我对其进行了一些扩展测试:

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,如果不是数字则返回false。我总是写=== true或=== false来让自己(和其他程序员)知道测试是预期的。


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>

这给我每行奇数和偶数类,这样我就可以使用正确的类并将打印结果分页向下。

我使用的完整示例请注意,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

试试这个,

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

0

警告,由于某些原因,此条件在for循环声明中不会评估为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

在#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 '18

它需要来自用户的输入并决定该输入。
伊姆兰·阿齐姆

所以什么都没有。
GordonM '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.