यदि संख्या विषम या सम है तो परीक्षण करें


261

यह पता लगाने का सबसे सरल तरीका क्या है कि संख्या / चर विषम है या PHP में भी है? क्या यह मॉड के साथ कुछ करना है?

मैंने कुछ स्क्रिप्ट की कोशिश की है लेकिन .. फिलहाल Google डिलीवर नहीं कर रहा है।


9
mod 'modulo' के लिए जेनेरिक शॉर्टहैंड शब्द है, उर्फ़ मॉड्यूलर arithmetic
Marc B

1
अधिक जानकारी यहाँ सहित: विषम या निर्धारित करने के लिए बिटवाइस ऑपरेटर का उपयोग करना तेज़ और अधिक कुशल है : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

जवाबों:


557

आप सोच रहे थे कि मॉड शुरू करने के लिए एक अच्छी जगह है। यहाँ एक अभिव्यक्ति है जो अगर सही $numberहै, तो गलत होने पर वापस आ जाएगी :

$number % 2 == 0

हर पूर्णांक PHP मान के लिए काम करता है , साथ ही साथ अंकगणितीय संचालक PHP देखें

उदाहरण:

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

आउटपुट:

यह भी है


10
यदि आप लूप या बड़ी मात्रा में इसका उपयोग करते हैं, तो आप Arius2038 द्वारा सुझाए गए बिटकॉइन पर विचार करना चाह सकते हैं, जो बहुत तेज़ है। बिटकॉइन विषम / यहां तक ​​कि जांच के लिए मेरा पसंदीदा तरीका है।
मार्टि

ठीक काम करता है लेकिन मैं सोच रहा हूं कि इसके पीछे क्या तर्क है? ऐसा क्यों है कि "10 == 0" होने पर सच्चे का मान दिया जाता है?
स्नेलन

तर्क यह है कि कोई भी संख्या 2 से विभाज्य है और शेष नहीं है। यदि आप $ 10% संख्या का उपयोग करते हैं, और आपकी $ संख्या 20 थी, तो यह सही होगा, लेकिन यदि आपकी $ संख्या 22 नहीं थी। यदि आप उदाहरण के लिए प्रत्येक 10 वें आइटम को लूप में खोजने की कोशिश कर रहे थे, तो आप $ 10% का उपयोग कर सकते हैं। ।
crdunst

1
@Tim, अगर 5% 2 = 1। लॉगिका 2 * 2 + 1 = 5. पीएचपी में 2 पाने के लिए कैसे है?
हेंड्री तनाका

1
@ हेंड्री - आप बिल्कुल क्या पूछ रहे हैं? एक संपूर्ण संख्या के रूप में एक विभाजन के लिए भागफल कैसे प्राप्त करें, या ...? यदि आपका यही मतलब है, तो आपको केवल परिणाम की आवश्यकता है; मंजिल (5/2) = 2
जॉय सबे

196

एक अन्य विकल्प एक साधारण सा चेकिंग है।

n & 1

उदाहरण के लिए:

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

1
यह निश्चित रूप से एक बड़ी मार्जिन द्वारा सी जैसी भाषा में पूर्णांक का उपयोग करते समय सबसे तेज़ तरीका होगा। क्या किसी ने यह निर्धारित करने के लिए बेंचमार्क किया है कि क्या यह PHP के लिए भी सही है?
थोमसट्रेटर

1
यह शायद सबसे तेज़ तरीका है, अगर PHP इंजन अच्छी तरह से कोडित था।
रॉल्फ

मैं कहूंगा कि यह सबसे तेज़ और सबसे सीधा रास्ता है। उत्तम।
रॉबीगोड

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
यह एक बिटवाइज़र ऑपरेटर है, इसलिए मेरा मानना ​​है कि जब तक आप यह नहीं जानते कि आप उस कल्पना के साथ क्या कर रहे हैं, मैं इस वाक्य रचना से बचूँगा।
डेन्हेरे

1
मुझे वाक्य रचना की प्रशंसा करनी है, जो चीजें बिना जाने क्यों काम करती हैं, आपको याद दिलाता है कि हम नशीली दवाओं की दुनिया में कितने छोटे हैं, गणित और, ठीक है, बस नंबर 1 पर एक पंक्ति जोड़ें, 2 नहीं ...
जोनास लुंडमैन

मैं JS में बिटवाइज़ ऑपरेटर्स का उपयोग बहुत कम करता हूं। के if (~string.indexOf("@")) {}बजाय उदाहरण के लिए if (string.indexOf("@") !== -1) {}। मैं परिस्थितियों को एक साधारण सही या गलत परिणाम के रूप में देखना पसंद करता हूं। लेकिन हां, यह उन लोगों के लिए थोड़ा भ्रमित हो सकता है जो इस वाक्य रचना से परिचित नहीं हैं।
मार्टिन जेम्स

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
}

यहां मेरे निष्कर्षों के प्रमाण के रूप में समय परीक्षण है


डाउनवॉटर करने के लिए: क्या मुझे पता है कि आपने डाउनवोट क्यों किया?
सबिन

4
यह अन्य तरीकों की तुलना में बहुत महंगा है।
17

@grantwparks खैर, isset और mod का उपयोग करने के बीच का अंतर केवल 0.5007 सेकंड है। लेकिन, array_search बहुत महंगा है।
सुबिन

2
@grantwparks मेरे पास कोड को अपडेट करने के लिए है in_arrayजिसमें मॉड ऑपरेटर को कभी-कभी शामिल किया जाता है।
सबिन

1
हालांकि सोचने का दिलचस्प तरीका। यह मूल रूप से $num & 1:) का दशमलव संस्करण है । आप इसे हेक्साडेसिमल भी कर सकते हैं: सरणी (0, 2, 4, 6, 8, ए, सी, ई, एफ): डी।
मैथिज्स वेसेल्स

5

मैंने थोड़ा परीक्षण किया, और पाया कि मॉड, is_intऔर &-ऑपरेटर के बीच , मॉड सबसे तेज़ है, और उसके बाद & -ऑपरेटर को बारीकी से देखा। is_intमॉड की तुलना में लगभग 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) "&" लगभग 10% तेज है, फिर mod (रैंडम पूर्णांक मानों के साथ सरणी पर परीक्षण किया गया)
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 की तुलना में कुछ अलग है?
पियरे-ओलिवियर वैर्स

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 शून्य और एक रिक्त स्ट्रिंग को स्वतः शून्य में परिवर्तित कर रही है। ऐसा मोडुलो के साथ भी होता है। कोड होगा

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

मूल्य के साथ $ संख्या = '' या $ संख्या = शून्य परिणाम सत्य है। मैं इसे और अधिक विस्तारित कुछ परीक्षण करता हूं:

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 को आबाद करता है

इसका मेरा उपयोग इसे फ़ॉरच लूप के अंदर रखने के लिए है, इससे ठीक पहले मुझे इसकी आवश्यकता है, यह मुझे एक उपयुक्त कक्षा के नाम देने के लिए एक बहुत ही कुशल लाइनर बनाता है, यह इसलिए है क्योंकि मेरे पास आईडी का उपयोग करने के लिए पहले से ही एक काउंटर है बाद में कार्यक्रम में। यह एक संक्षिप्त उदाहरण है कि मैं इस भाग का उपयोग कैसे करूंगा।

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

यह मुझे प्रत्येक पंक्ति पर विषम और यहां तक ​​कि कक्षाएं देता है ताकि मैं सही वर्ग का उपयोग कर सकूं और मेरे मुद्रित परिणामों को पृष्ठ के नीचे उतार सकूं।

आईडी का उपयोग करने का पूरा उदाहरण आईडी पर लागू काउंटर पर है और कक्षा में मेरा विषम / परिणाम भी लागू है।

$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
यह उत्तर क्या जोड़ता है कि मूल रूप से स्वीकृत उत्तर नहीं देता है?
गॉर्डन

-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
यह उत्तर क्या जोड़ता है कि मूल रूप से स्वीकृत उत्तर नहीं देता है?
गॉर्डन

यह उपयोगकर्ता से इनपुट लेता है और उस इनपुट पर निर्णय लेता है।
इमरान अजीम

तो वास्तव में कुछ भी नहीं।
गॉर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.