মানটি বিজোড় বা সমান কিনা তা পরীক্ষা করা হচ্ছে


173

আমি খুব সাধারণ অ্যালগরিদম দিয়ে সাধারণ isEven এবং isdd ফাংশন তৈরি করার সিদ্ধান্ত নিয়েছি :

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

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

এটি ঠিক আছে যদি এন নির্দিষ্ট পরামিতিগুলির সাথে থাকে তবে অনেকগুলি পরিস্থিতিতে ব্যর্থ হয়। সুতরাং আমি দৃust় ফাংশনগুলি তৈরি করতে বেরিয়েছি যা যতটা সম্ভব দৃশ্যের জন্য সঠিক ফলাফল সরবরাহ করে, যাতে জাভাস্ক্রিপ্ট সংখ্যার সীমাতে কেবল পূর্ণসংখ্যা পরীক্ষা করা হয়, অন্য সমস্ত কিছুই মিথ্যা (+ এবং - অনন্ততা সহ) ফিরিয়ে দেয়। মনে রাখবেন যে শূন্য সমান।

// 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));

উপরের বিষয়গুলি নিয়ে কেউ কি কোনও সমস্যা দেখতে পাবে? এর চেয়ে ভাল (উদাহরণস্বরূপ আরও নির্ভুল, দ্রুত বা আরও সংক্ষিপ্ত) সংস্করণটি কি আছে?

অন্যান্য ভাষার সাথে সম্পর্কিত বিভিন্ন পোস্ট রয়েছে তবে আমি ইসমাস্ক্রিপ্টের জন্য একটি নির্দিষ্ট সংস্করণ খুঁজে পাচ্ছি না।


উত্তর:


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

78

আমি একটি বিট পরীক্ষা ব্যবহার পছন্দ করি:

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

এটি পরীক্ষা করে যে প্রথম বিটটি কোন বিজোড় সংখ্যাকে নির্দেশ করে।


কেবলমাত্র দরকারী যদি আপনি জানেন যে আমি শুরু করার একটি নম্বর। অ সংখ্যার ফেরত পাঠাবেন অনির্ধারিত (হয়তো বা একটি ত্রুটি নিক্ষেপ, কিন্তু undefined যুক্তিসম্মত বলে মনে হয়)।
রবজি

3
একেবারে। বেস -২ গণিতের জন্য মডুলাস ব্যবহার করা অবৈধ হওয়া উচিত;)
aceofspades

4
টেরানারি: i & 1 == 1 ? console.log("odd") : console.log("even");এছাড়াও, বিট স্তর দক্ষতার জন্য +1 ( জেএসে তেমন বহুল ব্যবহৃত হয় না)
জেএসে

13
@ জ্যাকসনক্র নোট করুন যে জাভাস্ক্রিপ্টে কোনও "বিট লেভেল দক্ষতা" নেই কারণ সমস্ত নম্বর জাভাস্ক্রিপ্টে ভাসমান এবং বিটওয়াস অপারেটর ব্যবহারের অর্থ প্রথমে এটি একটি ইনটকে রূপান্তরিত করা, তারপরে অপারেশন সম্পাদন করা এবং তারপরে এটিকে আবার একটি ভাসমান পয়েন্ট সংখ্যায় রূপান্তর করা।
অকর্মা

1
@ পোকে সংশোধন করুন তারা টাইপ নম্বর রয়েছে তবে জেনে ভালো লাগলো যে শক্তভাবে টাইপ করা ভাষায় দক্ষতা রয়েছে।
রবার্ট ব্রিসিটা

8

নিম্নলিখিত সম্পর্কে কীভাবে? আমি কেবল এটি IE তে পরীক্ষা করেছি, তবে কোনও দৈর্ঘ্যের সংখ্যার প্রকৃত সংখ্যা, পূর্ণসংখ্যার বা ভাসমান সংখ্যার প্রতিনিধিত্বকারী স্ট্রিংগুলি পরিচালনা করতে পেরে এটি বেশ খুশি হয়েছিল এবং বুলিয়ান, অপরিজ্ঞাত, নাল, একটি অ্যারে বা কোনও বস্তু পাস করার পরে উভয় ফাংশনই মিথ্যা প্রত্যাবর্তন করেছিল। (আপ আপনাকে কিনা নেতৃত্ব দান বা ঐ খালি trailing উপেক্ষা করতে যখন একটি স্ট্রিং পাস করা হয়েছে - আমি অধিকৃত থাকেন তারা করছে না । উপেক্ষিত এবং বিনিময়ে মিথ্যা উভয় ফাংশন কারণ)

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

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

2
আমার বাস্তবায়নের জন্য এভেন (২.২২২ ই 3) সত্য প্রত্যাবর্তন করে, তবে আইভেন ("2.122e3") মিথ্যা প্রত্যাবর্তন করে। বিপরীতে আমার আইভেন () সত্যিই বড় সংখ্যার জন্য ব্যর্থ হয় কারণ জেএস রেজেজ টেস্টের স্ট্রিংয়ে রূপান্তরিত করার সময় তাদেরকে এক্সপোনিস্ট ফর্ম্যাটে রাখে। আচ্ছা ভালো.
nnnnnn

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

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

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

7

দ্রষ্টব্য: এছাড়াও নেতিবাচক সংখ্যা আছে।

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

কোথায়

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

1
পার্সইন্টের এখানে কি কোনও রডিক্সের দরকার নেই?
বুলেব্লা

@ ব্ল্যাব্লাব্যা হ্যাঁ, সমস্ত বাস্তবায়নই রেডিক্স = 10 হিসাবে ধরে নেয় না
রডরিগো

নেতিবাচক মূল্যবোধের ভাল উদ্ধৃতি। রবার্ট ব্রিসিতার উত্তর (যা পরে যুক্ত করা হয়েছিল) এটিকেও অন্তর্ভুক্ত করে।
জ্যাকসনকর



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

হয়তো এই? যদি (আমাদের সংখ্যা% 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। তবে আবার, এখানে ইতিমধ্যে অন্যান্য উত্তরগুলির মতো এটি একই।
হেরেটিক বানর

1
বা return parseInt(n)%2 === 0 || parseInt(n) === 0। তবে কেন পার্সেন্ট ? এটি "32foo" এবং 12.5এমন কি মানগুলির মতো সত্যের জন্য ফিরে আসে ।
রবিজি

-2
if (i % 2) {
return odd numbers
}

if (i % 2 - 1) {
return even numbers
}

1
কখন কোন সংখ্যা 2 দিয়ে বিভক্ত করার অনুস্মারক 2 হবে?
ব্যবহারকারী 85421

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