परीक्षण करना कि कोई मान विषम है या नहीं


173

मैं सरल बनाने का फैसला किया isEven और isOdd एक बहुत ही सरल एल्गोरिथ्म के साथ समारोह:

function isEven(n) {
  n = Number(n);
  return n === 0 || !!(n && !(n%2));
}

function isOdd(n) {
  return isEven(Number(n) + 1);
}

यदि n कुछ मापदंडों के साथ है तो ठीक है, लेकिन कई परिदृश्यों के लिए विफल रहता है। इसलिए मैंने ऐसे मजबूत कार्य बनाने के लिए निर्धारित किया, जो जितने अधिक परिदृश्यों के लिए सही परिणाम प्रदान करते हैं, उतने ही हैं कि जावास्क्रिप्ट संख्याओं की सीमा के भीतर केवल पूर्णांकों का परीक्षण किया जाता है, बाकी सब गलत (+ और - अनंत सहित) देता है। ध्यान दें कि शून्य सम है।

// Returns true if:
//
//    n is an integer that is evenly divisible by 2
//
// Zero (+/-0) is even
// Returns false if n is not an integer, not even or NaN
// Guard against empty string

(function (global) {

  function basicTests(n) {

    // Deal with empty string
    if (n === '') 
      return false;

    // Convert n to Number (may set to NaN)
    n = Number(n);

    // Deal with NaN
    if (isNaN(n)) 
      return false;

    // Deal with infinity - 
    if (n === Number.NEGATIVE_INFINITY || n === Number.POSITIVE_INFINITY)
      return false;

    // Return n as a number
    return n;
  }

  function isEven(n) {

    // Do basic tests
    if (basicTests(n) === false)
      return false;

    // Convert to Number and proceed
    n = Number(n);

    // Return true/false
    return n === 0 || !!(n && !(n%2));
  }
  global.isEven = isEven;

  // Returns true if n is an integer and (n+1) is even
  // Returns false if n is not an integer or (n+1) is not even
  // Empty string evaluates to zero so returns false (zero is even)
  function isOdd(n) {

    // Do basic tests
    if (basicTests(n) === false)
      return false;

    // Return true/false
    return n === 0 || !!(n && (n%2));
  }
  global.isOdd = isOdd;

}(this));

क्या कोई भी उपरोक्त मुद्दों को देख सकता है? वहाँ एक बेहतर (यानी अधिक सटीक, तेजी से या अधिक संक्षिप्त बिना obfuscated) संस्करण है?

अन्य भाषाओं से संबंधित विभिन्न पद हैं, लेकिन मुझे ECMAScript का कोई निश्चित संस्करण नहीं मिल रहा है।


जवाबों:


368

मापांक का प्रयोग करें:

function isEven(n) {
   return n % 2 == 0;
}

function isOdd(n) {
   return Math.abs(n % 2) == 1;
}

आप देख सकते हैं कि जावास्क्रिप्ट में किसी भी मूल्य को एक संख्या के साथ ज़ब्त किया जा सकता है:

Number.isFinite(parseFloat(n))

यह चेक अधिमानतः isEvenऔर isOddफ़ंक्शंस के बाहर किया जाना चाहिए , इसलिए आपको दोनों फ़ंक्शंस में त्रुटि हैंडलिंग की नकल करने की आवश्यकता नहीं है।


@ हां, लेकिन जेएस के पास कुछ विशेष मुद्दे हैं जब valueकोई संख्या नहीं है, या यहां तक ​​कि अगर यह एक संख्या है। पूर्व .: 0.1%2, NaN%2, []%2, आदि आप जवाब में क्या लिखा है, वह पहले से ही जानता है।
एलिन पुरकारू

1
0.1और NaNऊपर के कार्य के साथ ठीक काम करते हैं। खाली सरणी थोड़ा दर्द है क्योंकि यह 0 के बराबर है ...
स्टीव मेने

4
@ अलाइन - मैंने एक संख्यात्मक जाँच जोड़ी है। मुझे यकीन नहीं है कि मैं उस परिदृश्य को समझता हूं जब आप एक अंकगणितीय फ़ंक्शन को स्पष्ट रूप से अन्य डेटाटिप्स को संभालना चाहते हैं, लेकिन अगर यही ओपी चाहता है ...
स्टीव मेने

2
किससे बदल रहा return n == parseInt(n);है return n === parseInt(n);?
जमिनपी

2
मुझे लगता है कि मैंने कहीं पढ़ा है कि आपको n % 2 !== 0विषम संख्याओं की जांच करते समय क्या जांचना चाहिए , क्योंकि यह आवश्यक नहीं है 1, भाषा पर निर्भर करता है। संपादित करें: आह, यह वही है जो .absकॉल के लिए है। तो कोई बात नहीं।
ptf

79

मैं थोड़ा परीक्षण का उपयोग करना पसंद करता हूं:

if(i & 1)
{
    // ODD
}
else
{
    // EVEN
}

यह परीक्षण करता है कि क्या पहला बिट किस पर एक विषम संख्या को दर्शाता है।


केवल तभी उपयोगी होगा जब आप जानते हैं कि मैं एक संख्या है जिसे शुरू करना है। गैर-संख्याओं को अपरिभाषित लौटना चाहिए (या शायद कोई त्रुटि फेंक सकते हैं, लेकिन अपरिभाषित समझदार लगता है)।
रॉबग

3
पूर्ण रूप से। बेस -2 गणित के लिए मापांक का उपयोग करना अवैध होना चाहिए;)
aceofspades

4
टर्नरी: i & 1 == 1 ? console.log("odd") : console.log("even");इसके अलावा, बिट स्तर की दक्षता के लिए +1 (जेएस में व्यापक रूप से उपयोग नहीं किया गया)
जैक्सनक्र

13
@Jacksonkr ध्यान दें कि जावास्क्रिप्ट में कोई "बिट स्तर की दक्षता" नहीं है क्योंकि सभी संख्याएँ जावास्क्रिप्ट में तैरती हैं और बिटवाइज़ ऑपरेटर का उपयोग करने का मतलब है कि पहले इसे इंट में परिवर्तित करना, फिर ऑपरेशन करना और फिर इसे फ़्लोटिंग पॉइंट नंबर में परिवर्तित करना।
पोक

1
@ पोक सही है वे टाइप संख्या के हैं, लेकिन यह जानना अच्छा है कि दृढ़ता से टाइप की गई भाषाओं में दक्षता है।
रॉबर्ट ब्रिसिटा

8

निम्नलिखित के बारे में कैसे? मैंने केवल IE में यह परीक्षण किया था, लेकिन किसी भी लम्बाई, वास्तविक संख्या जो पूर्णांक या फ़्लोट थीं, की संख्याओं का प्रतिनिधित्व करते हुए तारों को संभालना काफी खुश था, और बूलियन, अपरिभाषित, अशक्त, एक सरणी या एक ऑब्जेक्ट पास होने पर दोनों फ़ंक्शन झूठे थे। (आपके ऊपर कि क्या आप एक स्ट्रिंग में पास होने पर प्रमुख या अनुगामी रिक्तता को अनदेखा करना चाहते हैं - मैंने मान लिया है कि उन्हें अनदेखा नहीं किया गया है और दोनों कार्यों को गलत तरीके से वापस करने का कारण है।)

function isEven(n) {
   return /^-?\d*[02468]$/.test(n);
}

function isOdd(n) {
   return /^-?\d*[13579]$/.test(n);
}

2
मेरे कार्यान्वयन के लिए ईवेन (2.122e3) सही है, लेकिन isEven ("2.122e3") गलत है। इसके विपरीत मेरा ईवेन () वास्तव में बड़ी संख्या के लिए विफल रहता है क्योंकि जेएस रेगेक्स टेस्ट के लिए स्ट्रिंग में परिवर्तित करते समय उन्हें एक्सपोनेंट प्रारूप में डालता है। ओह अच्छा।
nnnnnn

@MartijnScheffer - मुझे उन सभी अतिरिक्त मेमोरी के लिए बिल भेजने के लिए स्वतंत्र महसूस करें जिन्हें आपको खरीदना होगा। ध्यान दें कि प्रश्न में अन्य प्रकारों से संख्या तक रूपांतरण शामिल थे, और स्पष्ट रूप से मैं जो सुझाव दे रहा हूं उसका बिंदु एक सरल एक-पंक्ति फ़ंक्शन है जो संख्याओं और तारों को संभालता है । बेशक, मेरी अपनी टिप्पणी के अनुसार, यह वास्तव में सभी संभावित मामलों को संभालता नहीं है, लेकिन यह अभी भी उपयोगी हो सकता है - regex उपयोगकर्ता-दर्ज डेटा को मान्य करने का सबसे सरल तरीका है, जो शुरू में एक स्ट्रिंग होगा।
nnnnnn

क्या मैंने यहाँ एक टिप्पणी पोस्ट की? मैं इसे नहीं देखता, लेकिन अगर आप एक चाहते हैं तो !, यह एक सही समाधान नहीं है, यह सैकड़ों बार धीमा है, और हम संख्याओं के बारे में बात नहीं कर रहे हैं, अगर आप जांचना चाहते हैं कि क्या एक स्ट्रिंग वैध है संख्या, और एक पूर्णांक जिसे अलग-अलग संभाला जा सकता है।
मार्टिज़न शेफ़र

@MartijnScheffer - हाँ, आपकी टिप्पणी थी, मेरे उत्तर के बाद से कुछ बिंदु पर हटा दिया गया है। ध्यान दें कि प्रश्न केवल संख्याओं के बारे में नहीं था, ओपी के कोड में अन्य प्रकार के रूपांतरण शामिल थे। वैसे भी, आपकी प्रतिक्रिया के लिए धन्यवाद।
nnnnnn

7

नोट: ऋणात्मक संख्याएँ भी हैं।

function isOddInteger(n)
{
   return isInteger(n) && (n % 2 !== 0);
}

कहाँ पे

function isInteger(n)
{
   return n === parseInt(n, 10);
}

1
क्या यहाँ छंद की आवश्यकता नहीं है?
ब्लाब्लाब्ला

@blablabla हां, सभी कार्यान्वयन रेडिक्स = 10. नहीं मानते हैं
रॉड्रिगो 15

नकारात्मक मूल्यों का अच्छा उद्धरण। रॉबर्ट ब्रिसिटा का जवाब (जिसे बाद में जोड़ा गया) ने इसे भी कवर किया।
जैक्सनक्र सिप

4

ऐसा क्यों न करें:

    function oddOrEven(num){
        if(num % 2 == 0)
            return "even";
        return "odd";
    }
    oddOrEven(num);

या यहां तक ​​कि function isEven(num) { return num % 2 == 0}
चीपा

3
या const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
ईएस ६ के


1
var isEven = function(number) {
    // Your code goes here!
    if (number % 2 == 0){
       return(true);
    }
    else{
       return(false);    
    }
};

2
if ( <expression> ) return true else return falseप्रतिमान कर सकते हैं हमेशा सरल होने की return ( <expression> )(एक में अभिव्यक्ति के बाद से if पहले से ही हमेशा एक बूलियन एक है)।
गेरोल्ड ब्रॉसर

यह कहना कि रिटर्न एक फ़ंक्शन नहीं है, यह कहने की तरह है कि यदि कोई फ़ंक्शन नहीं है, तो मान वापस करते समय कोष्ठक का उपयोग करना पूरी तरह से मान्य है (भले ही वे यहां उपयोगी नहीं हों)
मार्टिज़न शेफ़र

1

स्टीव मेने जवाब का एक सरल संशोधन / सुधार!

function isEvenOrOdd(n){
    if(n === parseFloat(n)){
        return isNumber(n) && (n % 2 == 0);
    }
    return false;
}

नोट: अमान्य होने पर गलत रिटर्न!


1

हमें इसके लिए सिर्फ एक लाइन का कोड चाहिए!

जेएस कार्यों के लिए नए ईएस 6 सिंटैक्स और स्टेटमेंट स्टेटमेंट के लिए एक-लाइन सिंटैक्स का उपयोग करते हुए यहां ऐसा करने का एक नया और वैकल्पिक तरीका है if-else:

const isEven = num => ((num % 2) == 0) ? true : false;

alert(isEven(8));  //true
alert(isEven(9));  //false
alert(isEven(-8)); //true

1
जो छोटा है let isEven = num => num % 2 === 0। :-) लेकिन वास्तव में यह कई अन्य उत्तरों के लिए अलग नहीं है।
रॉब

1

कुछ

x % 2 == 0; // Check if even

!(x & 1); // bitmask the value with 1 then invert.

((x >> 1) << 1) == x; // divide value by 2 then multiply again and check against original value

~x&1; // flip the bits and bitmask

0

अलग तरीका:

var isEven = function(number) {
  // Your code goes here!
  if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;};
};

isEven(69)

0

तार का उपयोग करते हुए अन्य, क्योंकि क्यों नहीं

function isEven(__num){
    return String(__num/2).indexOf('.') === -1;
}

0
if (testNum == 0);
else if (testNum % 2  == 0);
else if ((testNum % 2) != 0 );

आपके स्पष्टीकरण के बिना आपके योगदान का अधिक मूल्य नहीं है। यह उन सूचनाओं को भी दोहराता है जो पहले ही चर्चा में प्रस्तुत की जा चुकी हैं।
सिंडी मीस्टर

धन्यवाद सिंडी! बस एक समाधान की पेशकश!
लिंडसे

लेकिन ... यह वास्तव में नहीं है ऐसा कुछ भी। यह कुछ वापस नहीं करना चाहिए?
nnnnnn

0

शायद यह? यदि (हमाराNumber% 2! == 0)


2
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। कृपया अपने कोड को व्याख्यात्मक टिप्पणियों के साथ भीड़ न दें, इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
फिल्नोर

0
var num = someNumber
    isEven;
parseInt(num/2) === num/2 ? isEven = true : isEven = false;

0

for(var a=0; a<=20;a++){
   if(a%2!==0){
       console.log("Odd number "+a);
   }
}

for(var b=0; b<=20;a++){
    if(b%2===0){
        console.log("Even number "+b);  
    }     
 }


हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोट मिले। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
डेनियल

-1

यह जांचने के लिए कि आपके पास विषम या समान संख्या है या नहीं, यह भी काम करता है।

const comapare = x => integer(checkNumber(x));

function checkNumber (x) {
   if (x % 2 == 0) {
       return true;
   } 
   else if (x % 2 != 0) {
       return false;
    }
}

function integer (x) {
   if (x) {
       console.log('even');
   } 
   else {
       console.log('odd');
    }
}

-1

आधुनिक जावास्क्रिप्ट शैली का उपयोग करना:

const NUMBERS = "nul one two three four five six seven ocho nueve".split(" ")

const isOdd  = n=> NUMBERS[n % 10].indexOf("e")!=-1
const isEven = n=> isOdd(+n+1)

isOdd('5'))सच लौटाता है। isEven('5')यह भी सच है। isOdd(NaN)एक त्रुटि फेंकता है। :-(
रोबग

तय किया हुआ isEven('5')isOdd(NaN)शायद एक त्रुटि फेंकनी चाहिए।
गन

1
स्क्रिप्ट होस्ट त्रुटि को संभालना नहीं चाहिए, फ़ंक्शन को होना चाहिए। मुझे हमेशा बताया गया कि एक कोर डंप एक सामान्य समाप्ति नहीं है । ;-)
रॉब


-2
function isEven(n) {return parseInt(n)%2===0?true:parseInt(n)===0?true:false}

जब 0 / भी चाहता था लेकिन

isEven(0) //true
isEven(1) //false
isEven(2) //true
isEven(142856) //true
isEven(142856.142857)//true
isEven(142857.1457)//false


या return parseInt(n)%2===0?true:parseInt(n)===0। लेकिन फिर, यह पहले से ही यहाँ कई अन्य उत्तरों के समान है।
Heretic बंदर

1
या return parseInt(n)%2 === 0 || parseInt(n) === 0। लेकिन क्यों parseInt ? यह "32foo" जैसे मूल्यों के लिए सही है 12.5, और , जो भी नहीं हैं।
रॉब

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