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


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 음, isset 과 mod를 사용하는 것의 차이점은 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.