숫자가 홀수인지 짝수인지 테스트


261

PHP에서 숫자 / 변수가 홀수인지 심지어 짝수인지 확인하는 가장 간단한 방법은 무엇입니까? mod와 관련이 있습니까?

몇 가지 스크립트를 시도했지만 .. Google이 현재 제공하지 않습니다.



1
여기에 포함 된 추가 정보 : 비트 연산자 를 사용하는 것이 홀수 또는 심지어 더 빠르고 효율적인지 결정하려면 : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

답변:


557

당신은 모드가 시작하기에 좋은 장소라고 생각하는데 옳았습니다. $number짝수 이면 true를 반환 하고 홀수이면 false를 반환하는 표현식이 있습니다 .

$number % 2 == 0

모든 정수 PHP 값에 대해 작동합니다 . 산술 연산자 PHP 도 참조하십시오 .

예:

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

산출:

심지어


10
이것을 루프 또는 대량으로 사용하는 경우 Arius2038이 제안한 비트 검사를 고려할 수 있습니다. 이는 매우 빠릅니다. 비트 검사는 홀수 / 짝수 검사에 선호되는 방법입니다.
Martijn

잘 작동하지만 이것의 논리가 무엇인지 궁금합니다. "10 == 0"인 경우 true 값이 제공되는 이유는 무엇입니까?
snlan

논리는 짝수를 나머지없이 2로 나눌 수 있다는 것입니다. $ number % 10을 사용하고 $ number가 20 인 경우 true를 반환하지만 $ number가 22 인 경우에는 그렇지 않습니다. 예를 들어 루프에서 10 번째 항목을 모두 찾으려면 $ number % 10을 사용할 수 있습니다. .
crdunst

1
5 % 2 = 1 인 경우 @Tim. 논리는 2 * 2 + 1 = 5입니다. PHP에서 2를 얻는 방법은 무엇입니까?
Hendry Tanaka

1
@ 헨 드리-정확히 무엇을 묻고 있습니까? 나누기의 몫을 정수로 얻는 방법 또는 ...? 그것이 당신이 의미하는 바라면, 결과를 floor () 시키면됩니다. 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

23

예 모드를 사용하여

$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

1
이유를 모르고 작동하는 구문에 감탄해야합니다. 우리가 물리학, 수학의 세계에서 얼마나 작은 지 상기시켜줍니다. 그리고 2가 아닌 1에 행을 추가하면됩니다.
Jonas Lundman

나는 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로 : 왜 downvoted했는지 알고 싶습니다.
Subin

4
다른 방법에 비해 매우 비쌉니다.
grantwparks

@grantwparks 음, issetmod를 사용하는 것의 차이점은 0.5007 초입니다. 그러나 array_search 는 매우 비쌉니다.
Subin

2
@grantwparks in_array때로는 비트 비트 연산자 를 포함하도록 코드를 업데이트했습니다 .
Subin

1
그래도 재미있는 생각입니다. 기본적으로 십진수 버전입니다 $num & 1:). 당신은 또한 16 진수를 할 수 있습니다 : array (0, 2, 4, 6, 8, A, C, E, F) : D.
Matthijs Wessels

5

나는 약간의 테스트를했는데 mod is_int&-operator 사이 에서 mod가 가장 빠르며 & 연산자가 밀접 하다는 것을 알았습니다 . is_intmod보다 거의 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
}

0은 짝수입니다. 다시 말해, 그 정수 (정수의 품질이 짝수 또는 홀수 임)는 동일합니다. 0을 증명하는 가장 간단한 방법은 "짝수"의 정의에 맞는지 확인하는 것입니다. 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과 빈 문자열을 자동으로 0으로 변환합니다. 그것은 모듈로에서도 발생합니다. 따라서 코드는

$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 루프 안에 그것을 배치하는 것이 필요합니다. 이것은 적절한 클래스 이름을 제공하는 매우 효율적인 라이너입니다. 나중에 프로그램에서. 이것은이 부분을 어떻게 사용할 지에 대한 간단한 예입니다.

<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

경고 : 어떤 이유로이 조건은 아래와 같이 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";
}

이 작품 OK :

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

# 입력 필드로 이것을 시도하십시오

<?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.