সংখ্যাটি বিজোড় বা সমান কিনা তা পরীক্ষা করুন


261

কোনও সংখ্যা / ভেরিয়েবল বিজোড় বা এমনকি পিএইচপি-তে রয়েছে তা খুঁজে বের করার সহজতম সরলতম উপায় কী? এটা মোড কিছু করার আছে?

আমি কয়েকটি স্ক্রিপ্ট চেষ্টা করেছি তবে .. গুগল এই মুহুর্তে সরবরাহ করছে না।


9
মোড 'মডুলো' এর জেনেরিক শর্টহ্যান্ড শব্দ, ওরফে মডুলার গাণিতিক
মার্ক বি

1
এখানে আরও তথ্য সহ: বিজোড় নির্ধারণ করতে বা বিটওয়াইস অপারেটরটি ব্যবহার করা আরও দ্রুত এবং আরও দক্ষ : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

উত্তর:


557

আপনি ভাবতে ঠিক ছিলেন মোড শুরু করার জন্য ভাল জায়গা। এখানে এমন একটি অভিব্যক্তি যা সমান হলে সত্য $number, বিজোড় হলে মিথ্যা হবে:

$number % 2 == 0

প্রতিটি পূর্ণসংখ্যার পিএইচপি মানের জন্য কাজ করে , পাশাপাশি অঙ্কিত অপারেটর পিএইচপি দেখুন

উদাহরণ:

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

আউটপুট:

এটা এমনকি


10
আপনি যদি এটি লুপস বা বৃহত পরিমাণে ব্যবহার করেন তবে আপনি আরিয়ুশ ২০৩৮ দ্বারা প্রস্তাবিত বিচিচটি বিবেচনা করতে পারেন, এটি খুব দ্রুত। বিচিচটি বিজোড় / এমনকি চেকগুলির জন্য আমার পছন্দের পদ্ধতি।
মার্টিজন

ভাল কাজ করে তবে আমি ভাবছি এর পিছনে যুক্তিটি কী? "10 == 0" হলে সত্যের মান কেন দেওয়া হয়?
স্লান

যুক্তিটি হ'ল যে কোনও সমান সংখ্যাটি বাকী ছাড়াই 2 দিয়ে বিভাজ্য। যদি আপনি $ সংখ্যা% 10 ব্যবহার করেন, এবং আপনার $ সংখ্যা 20 হয়, তবে এটি সত্য হবে, তবে আপনার 22 সংখ্যাটি 22 হলে নয়। আপনি লুপে প্রতি 10 তম আইটেম সন্ধান করার চেষ্টা করলে আপনি $ সংখ্যা% 10 ব্যবহার করতে পারেন ।
crdunst

1
@ টিম, যদি 5% 2 = 1 হয়। লগিকাটি 2 * 2 + 1 = 5. পিএইচপি-তে 2 কীভাবে পাবেন?
হেন্ড্রি তনাকা

1
@ হেন্ড্রি - আপনি ঠিক কী জিজ্ঞাসা করছেন? পুরো সংখ্যা হিসাবে বিভাগের জন্য ভাগফল কীভাবে পাবেন, বা ...? যদি আপনি যা বোঝাতে চান এটির জন্য, আপনাকে কেবল ফলাফলটি মেটাতে হবে (); তল (5/2) = 2
জোয়ে সাবেই

196

অন্য বিকল্পটি হল একটি সহজ বিট চেকিং।

n & 1

উদাহরণ স্বরূপ:

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

1
বৃহত্তর ব্যবধানে, সি জাতীয় ভাষায় পূর্ণসংখ্যার ব্যবহার করার সময় এটি অবশ্যই দ্রুততম উপায় হবে। পিএইচপি-র ক্ষেত্রেও এটি সত্য কিনা তা নির্ধারণ করার জন্য কি কেউ বেঞ্চমার্ক করেছেন?
থোমাসরুটটার

1
এটি সম্ভবত সবচেয়ে দ্রুততম উপায়, যদি পিএইচপি ইঞ্জিনটি ভাল কোড করে থাকে।
রল্ফ

আমি বলব এটি দ্রুত এবং সর্বাধিক সোজা এগিয়ে যাওয়ার উপায়। পারফেক্ট।
রবিবিগড

4
উপরের লিঙ্কটি মারা গেছে। এখানে আরও একটি ভাল ব্যাখ্যা এখানে দেওয়া হয়েছে: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must- জ্ঞান
কাসিমির


8

উত্তরগুলির সমস্ত ভাল এবং সঠিক হলেও এক লাইনে সহজ সমাধান হ'ল:

$check = 9;

করুন:

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

বা:

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

খুব ভাল কাজ করে।


7
(bool)($number & 1)

অথবা

(bool)(~ $number & 1)

3
আমি এটি বিশ্বাস করি কিছুটা অপারেটর আমি বিশ্বাস করি যদি আপনি না জানেন যে আপনি কী অভিনবতার সাথে করছেন তবে আমি এই বাক্য গঠনটি এড়িয়ে যাব।
ড্যানারে

1
আমাকে সিনট্যাক্সটির প্রশংসা করতে হবে, জিনিসগুলি কেন না জেনে কাজ করে তা আপনাকে স্মরণ করিয়ে দেয় যে আমরা কল্পবিজ্ঞানের জগতে কত ছোট, গণিত এবং, ঠিক আছে, কেবল 2 নয়, 1 নম্বরে একটি সারি যুক্ত করব ...
জোনাস লন্ডম্যান

আমি জেএসে বিটওয়াইস অপারেটরগুলি বেশ কিছুটা ব্যবহার করি। 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
অন্যান্য পদ্ধতির তুলনায় এটি খুব ব্যয়বহুল।
গ্র্যান্টপর্পস

@grantwparks ঠিক আছে, isset এবং mod ব্যবহারের মধ্যে পার্থক্যটি কেবলমাত্র 0.5007 সেকেন্ড। তবে, অ্যারে_সার্ক খুব ব্যয়বহুল।
সাবিন

2
@ গ্রান্টপ্পার্কস আমার in_arrayমাঝে কোড আপডেট করে থাকে যাতে কখনও কখনও মোড অপারেটরকে মারধর করে include
সাবিন

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 / ক্লিপ / কোনও অপচেনা / i7) "&" প্রায় 10% দ্রুত তবে মোড (এলোমেলোভাবে পূর্ণসংখ্যার মানগুলির সাথে অ্যারে টেস্ট করা)
পাভেল ডুবিয়েল

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
}

জিরো একটি সমান সংখ্যা। অন্য কথায় এর সমতা an একটি পূর্ণসংখ্যার সমান বা বিজোড়ের গুণমান even এটি সমান। শূন্যকে সমান প্রমাণ করার সহজ উপায়টি এটি "এমনকি" এর সংজ্ঞা অনুসারে ফিট করে কিনা তা পরীক্ষা করা: এটি 2 এর একটি পূর্ণসংখ্যা একক, বিশেষত 0 × 2 ফলস্বরূপ, শূন্যটি এমন সমস্ত বৈশিষ্ট্য ভাগ করে যা সংখ্যার বৈশিষ্ট্যযুক্ত: 0 2 দ্বারা বিভাজ্য হয়, 0 উভয় পক্ষকে বিজোড় সংখ্যা দ্বারা বেষ্টিত হয়, 0 হ'ল একটি পূর্ণসংখ্যার যোগফল (0) এর সাথে থাকে এবং 0 টি বস্তুর একটি সেট দুটি সমান সেটে বিভক্ত হতে পারে। http://en.wikedia.org/wiki/Parity_of_zero থেকে


1
আমি বুঝতে পারছি না। কেন (এন + 2)% 2? কোন ক্ষেত্রে এটি n% 2 এর চেয়ে আলাদা কিছু ফেরত দেয়?
পিয়েরে-অলিভিয়ের ভারেসে

2

এই নম্বরটি বিজোড় বা এমনকি পিএইচপি-তে রয়েছে কিনা তা পরীক্ষা করে। উদাহরণে $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

পিএইচপি নাল এবং একটি খালি স্ট্রিং স্বয়ংক্রিয়ভাবে শূন্যে রূপান্তর করছে। মডুলোর পাশাপাশি এটি ঘটে। তার জন্য কোড হবে

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

মান $ সংখ্যা = '' বা $ সংখ্যা = এর সাথে নাল ফলাফল result আমি এটির জন্য আরও কিছুটা বর্ধিত পরীক্ষা করছি:

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

আমি অনুমান করছি যে ইতিমধ্যে একটি কাউন্টার রয়েছে। lo i এ যা লুপের শেষে বৃদ্ধি করা হয়, এটি আমার জন্য শর্টহ্যান্ড কোয়েরি ব্যবহার করে।

$row_pos = ($i & 1) ? 'odd' : 'even';

সুতরাং এটি কী করে, এটি আমাদের বক্তব্যটি উত্সাহিত করে - এটির সত্য বা মিথ্যা কী ফিরে আসে তার সিদ্ধান্ত নেবে কি না তার উপর নির্ভর করে od আমি অদ্ভুত। প্রত্যাবর্তিত মানটি আমাদের পরিবর্তনশীল $ قطار_পোসকে পপুলেট করে

আমার এটির ব্যবহারটি আমার প্রয়োজনের ঠিক আগে এটি ফোরচ লুপের ভিতরে রাখা, এটি আমাকে যথাযথ শ্রেণির নাম দেওয়ার জন্য একটি খুব দক্ষ একটি লাইনার তৈরি করে, এটি কারণ আইডির ব্যবহার করার জন্য আমার কাছে ইতিমধ্যে একটি কাউন্টার রয়েছে পরে প্রোগ্রামে। এটি আমি এই অংশটি কীভাবে ব্যবহার করব তার একটি সংক্ষিপ্ত উদাহরণ।

<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

সতর্কতা, কিছু কারণে, লন্ড ঘোষণার জন্য এই শর্তটি সত্য হিসাবে মূল্যায়ন করে না , নীচে দেখানো হয়েছে:

প্রতিটি পুনরাবৃত্তির শুরুতে, expr2মূল্যায়ন করা হয়। যদি এটি সত্যায় মূল্যায়ণ করা হয় তবে লুপটি অবিরত থাকে এবং নেস্টেড স্টেটমেন্ট (গুলি) কার্যকর করা হয়। যদি এটি মিথ্যাতে মূল্যায়ন করে, লুপটির কার্যকারিতা শেষ হয়।


এটি কাজ করে না :

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

# ইনপুট ক্ষেত্রের সাথে এটি ব্যবহার করে দেখুন

<?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
এই উত্তরটি কী যুক্ত করে যা মূলত গৃহীত উত্তর দেয় না?
গর্ডনএম

এটি ব্যবহারকারীর কাছ থেকে ইনপুট নেয় এবং সেই ইনপুটটির বিষয়ে সিদ্ধান্ত নেয়।
ইমরান আজিম

আসলে কিছুই না।
গর্ডনএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.