JavaScript'te bir sayının garip olup olmadığını belirleme


245

JavaScript kodundaki bir sayının çift mi yoksa tek mi olduğunu belirlemek için kimse beni bazı kodlara yönlendirebilir mi?



1
@DavidThomas Kısmen katılıyorum, ancak iki uyarım var: 1. Seçmem gerekirse, yeni başlayan bir programcı %operatörü daha iyi biliyordu &ve 2. &Teorik olarak daha hızlı olsa da, gerçekten önemli değil .
kojiro

3
@kojiro: Bir öğrenciye daha çok (geçerli) seçenek sunmak isterdim; Ayrıca daha önce hiç bitwise- ve bu şekilde kullanmayı düşünmemiştim, bu yüzden ilginç bir şey. Her neyse, bir dupe olduğu için, önceden var olan soru ile birleşme için işaretledim. Umarım, o zaman, buradaki cevaplar (en azından o cevap) kaybolmaz.
David, Monica'nın

1
@kojiro Hesaplama süresinin çoğu fonksiyon çağrıları tarafından alındığından, kemanınızın oldukça yararsız olduğunu söylemekten korkuyorum. Ama kimse bir numaranın tek veya çift olup olmadığını belirlemek için bir işlev çağrısı kullanmayacak ...
Testinizde

Yanıtlar:


347

Aşağıdaki kodu kullanın:

function isOdd(num) { return num % 2;}
console.log("1 is " + isOdd(1));
console.log("2 is " + isOdd(2));
console.log("3 is " + isOdd(3));
console.log("4 is " + isOdd(4));

1 tek bir sayıyı, 0 ise çift bir sayıyı temsil eder.


97
Bunun geri döneceğini 0veya 1(veya NaNsayı olmayan ve birine zorlanamayan bir şeyi beslerseniz), çoğu durumda işe yarayacağını unutmayın. Ama gerçek trueya da isterseniz false:return (num % 2) == 1;
TJ Crowder

3
evet NaN hakkında iyi bir not. Ama genellikle, javascript'in doğru veya falsey olmasını istersiniz, bu yüzden onu yaptığım gibi yazdım.
Chii

9
Açıklığa kavuşturmak için, modulo operatörü (%) bir bölümün geri kalanını verir. Yani% 3 2, 3/2 olacak ve 1'i geri kalan olarak bırakacak, bu nedenle% 3 2 1'e dönecek.
Abuh

6
TJ'nin söylediklerine ek olarak, numtamsayı değilse bu bir kesir döndürür . Karşılaştırırsanız isOdd(1.5)==true( yine de kesirli bir değere eşit olmadığı için true) yine de çalışır , ancak işlev döndürüldüğünde trueveya false"isOdd" adının ima ettiği gibi daha iyi olur .
nnnnnn

6
Ayrıca return !!(num % 2)bir boole elde edebilirsiniz
Duncan

115

Bitsel ANDişleci kullanın .

function oddOrEven(x) {
  return ( x & 1 ) ? "odd" : "even";
}

function checkNumber(argNumber) {
  document.getElementById("result").innerHTML = "Number " + argNumber + " is " + oddOrEven(argNumber);
}
 
checkNumber(17);
<div id="result" style="font-size:150%;text-shadow: 1px 1px 2px #CE5937;" ></div>

Bir dize döndürme değeri değil, bir boole değeri istiyorsanız, bunu kullanın:

var isOdd = function(x) { return x & 1; };
var isEven  = function(x) { return !( x & 1 ); };

5
1, sen cevap kesinlikle sadece cevabı olduğunu saymıyorum, maden yener gelmez kullanmak X % Y!
s0d4pop

4
Testimin doğru olup olmadığından emin değilim, ancak bitsel VE sabit bir sayı için modulo operatöründen 40 kat ve rastgele bir sayı için 2 kat daha yavaş görünüyor: jsperf.com/odd-or-even
Blender

8
Bu değerin ikisinden biri olmayan sayılar için "tek" veya "çift" değerini döndüreceğini unutmayın (ör. 3.14).
nnnnnn

2
Veya: function isEven(n){return !(n & 1);}.
RobG

7
@Gnuey Her sayı bir dizi bitten oluşur. Tüm tek sayılar en az anlamlı (en sağdaki) bit 1'e, tüm çift sayılar 0'a sahiptir. x & 1Son bitin sayıda ayarlanıp ayarlanmadığını kontrol eder (çünkü 1, en az anlamlı bit dışında tüm bitler 1'e ayarlanmış bir sayıdır ): bu takdirde ise , sayı aksi bile garip.
13'te 0x499602D2

31

Bunun gibi bir şey yapabilirsiniz:

function isEven(value){
    if (value%2 == 0)
        return true;
    else
        return false;
}

9
Booleanın ne olduğunu bildiğiniz gibi görünmüyor. if (condition) { answer=true; } else { answer=false; }sadece gereksiz bir kelime answer = (bool) condition;. İşlevinizi azaltın function isEven(value) { return (bool) (value%2 == 0); }ve hepimiz mutlu olacağız.
awm

9
Sinsi olmaya gerek yok, çünkü farklı bir şey programlıyorum.
TNC

5
@awm - gibi görünüyor Eğer JavaScript bilmiyorum. İle (bool)(bu bir hata verir) boole yazamazsınız ve her durumda yapmanız gerekmez: operatör bir boole döndürdüğü return value%2 == 0;için işi yapar ==.
nnnnnn

2
Wow, gerçekten yazdım mı? Evet, bu kesinlikle yanlış; gibi bir şey olmalı answer = !!(condition). Yapmaya çalıştığım nokta, elbette return value%2==0koşullu ile uğraşmanıza gerek yok.
awm

Zarif buluyorum: value%2===0
carlodurso

17
function isEven(x) { return (x%2)==0; }
function isOdd(x) { return !isEven(x); }

13

Çok sayıda çift sayıya sahip bir dizi yapmak zorunda mıyım?

Hayır. Modülü (%) kullanın. Böldüğünüz iki sayının kalanını size verir.

Ex. 2 % 2 = 0 because 2/2 = 1 with 0 remainder.

Ex2. 3 % 2 = 1 because 3/2 = 1 with 1 remainder.

Ex3. -7 % 2 = -1 because -7/2 = -3 with -1 remainder.

Bu, x ile 2 sayısını değiştirirseniz, 0 veya 1 veya -1 elde edeceğiniz anlamına gelir. 0 eşit olduğu anlamına gelir. Başka bir şey tuhaf olduğu anlamına gelir.


8

Bu, küçük bir kod snippet'i ile çözülebilir:

function isEven(value) {
    if (value%2 == 0)
    return true;
else
    return false;
}

Bu yardımcı olur umarım :)


6

Birçok dil gibi Javascript'in de bölünmenin kalanını bulan bir modül operatörü% vardır . 2'ye bölündükten sonra kalan yoksa, bir sayı çifttir:

// this expression is true if "number" is even, false otherwise
(number % 2 == 0)

Bu, tam sayıları bile test etmek için çok yaygın bir deyimdir.


3
Ancak, modül negatif değerler için zor / tanımsız olabilir. Uygun dil spesifikasyonuna başvurduğunuzdan emin olun.


5

Basit bir işlev üzerinden geçebilirsiniz. Modulo operatörünü kullanır %:

var is_even = function(x) {
    return !(x % 2); 
}

is_even(3)
false
is_even(6)
true

1
Üçlü operatördeki sonuçlarınız 'doğru' veya 'yanlış' ise, gerçekten üçlü operatöre ihtiyacınız yoktur. Burada şunları yapabilirsin / yapmalısın:return !(x % 2);
dom_watson

4

Uzantılarımı kullan:

Number.prototype.isEven=function(){
     return this % 2===0;
};

Number.prototype.isOdd=function(){
     return !this.isEven();
}

sonra

var a=5; 
 a.isEven();

== False

 a.isOdd();

== Gerçek

Bir Sayı olup olmadığından emin değilseniz, aşağıdaki dallara göre test edin:

if(a.isOdd){
    a.isOdd();
}

GÜNCELLEME :

değişken kullanmazsanız:

(5).isOdd()

Verim :

Prosedür paradigmasının OOP paradigmasından daha iyi olduğu ortaya çıktı. Bu arada, bu FIDDLE'da profil oluşturma yaptım . Ancak, OOP yolu hala en güzel.

resim açıklamasını buraya girin


Teşekkürler ahbap, bu mantık için, görüşmeci biri bu tür bir mantık istedi, cevap veremedi, şimdi anladım, teşekkürler .. ama bu yöntemi izleyerek performansta herhangi bir fayda var mı? isEven (x) yazabilirdik; vs
Shoib Mohammed A

@ShoibMohammedA: Karşılaştırma yapıldı! jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI

-1 yerel prototip işlevlerini genişletmez. ( stackoverflow.com/questions/14034180/… )
tfmontague

3

-1 veya 0 değerine ulaşıncaya kadar 2'yi yinelemeli olarak çıkarın (yalnızca açıkça pozitif tamsayılar için çalışır)


Negatif sayılarla bunun yerine 2'yi artırabilirsiniz
Hydroper

Ve n = 2 ^ 52 olduğunda ve c> 2 ^ 53 için sonsuz miktarda bir zaman alır
rioV8

3

Bir for ifadesi ve koşullu bir sayı veya sayı dizisinin tek olup olmadığını belirlemek için kullanabilirsiniz:

for (var i=1; i<=5; i++) 
if (i%2 !== 0) {
    console.log(i)
}

Bu, 1 ile 5 arasındaki her tek sayıyı yazdırır.


3

Sadece bunu Adobe Dreamweaver'da yürüttüm ... mükemmel çalışıyor. i (isNaN (mynmb)) ise kullanılır

Değer bir sayı olup olmadığını kontrol etmek için, ve ben de negatif sayıyı pozitif dönüştürmek ve hesaplamak için Math.abs (mynmb% 2) kullandım

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

</head>
<body bgcolor = "#FFFFCC">
    <h3 align ="center"> ODD OR EVEN </h3><table cellspacing = "2" cellpadding = "5" bgcolor="palegreen">
        <form name = formtwo>
            <td align = "center">
                <center><BR />Enter a number: 
                    <input type=text id="enter" name=enter maxlength="10" />
                    <input type=button name = b3 value = "Click Here" onClick = compute() />
                      <b>is<b> 
                <input type=text id="outtxt" name=output size="5" value="" disabled /> </b></b></center><b><b>
                <BR /><BR />
            </b></b></td></form>
        </table>

    <script type='text/javascript'>

        function compute()
        {
          var enter = document.getElementById("enter");
          var outtxt = document.getElementById("outtxt");

          var mynmb = enter.value;
          if (isNaN(mynmb)) 
          { 
            outtxt.value = "error !!!"; 
            alert( 'please enter a valid number');
            enter.focus();
            return;
          }
          else 
          { 
             if ( mynmb%2 == 0 ) { outtxt.value = "Even"; }  
             if ( Math.abs(mynmb%2) == 1 ) { outtxt.value = "Odd"; }
          }
        }

    </script>
</body>
</html>

3
   <script>
        function even_odd(){
            var num =   document.getElementById('number').value;

            if ( num % 2){
                document.getElementById('result').innerHTML = "Entered Number is Odd";
            }
            else{
                document.getElementById('result').innerHTML = "Entered Number is Even";
            }
        }
    </script>
</head>
<body>
    <center>
        <div id="error"></div>
        <center>
            <h2> Find Given Number is Even or Odd </h2>
            <p>Enter a value</p>
            <input type="text" id="number" />
            <button onclick="even_odd();">Check</button><br />
            <div id="result"><b></b></div>
        </center>
    </center>
</body>

2
if (X % 2 === 0){
} else {
}

X'i numaranızla değiştirin (bir değişkenden gelebilir). If ifadesi sayı çift olduğunda, diğerse tek olduğunda çalışır.

Herhangi bir sayının garip olup olmadığını bilmek istiyorsanız:

if (X % 2 !== 0){
}

Yine, X'i bir sayı veya değişkenle değiştirin.


2

İki yaprağa bölündüğünde her bir tek sayı 1 olarak kalır ve sıfıra bölündüğünde her bir çift sayı olarak bir sıfır bırakır. Bu nedenle bu kodu kullanabiliriz

  function checker(number)  {
   return number%2==0?even:odd;
   }

2

Buna ne dersin...

    var num = 3 //instead get your value here
    var aa = ["Even", "Odd"];

    alert(aa[num % 2]);

2

Ben de öyle yaptım

//Array of numbers
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,32,23,643,67,5876,6345,34,3453];
//Array of even numbers
var evenNumbers = [];
//Array of odd numbers
var oddNumbers = [];

function classifyNumbers(arr){
  //go through the numbers one by one
  for(var i=0; i<=arr.length-1; i++){
     if (arr[i] % 2 == 0 ){
        //Push the number to the evenNumbers array
        evenNumbers.push(arr[i]);
     } else {
        //Push the number to the oddNumbers array
        oddNumbers.push(arr[i]);
     }
  }
}

classifyNumbers(numbers);

console.log('Even numbers: ' + evenNumbers);
console.log('Odd numbers: ' + oddNumbers);

Nedense dizi uzunluğunun tek tek olduğundan emin olmak zorunda kaldı. Bunu yapmadığımda, oddNumbers dizisinin son öğesinde "tanımsız" alıyorum.


2
Bunun nedeni, koşulun dizinin uzunluğuna eşit veya daha az "<=" olarak ayarlanmış olmasıdır. Eşit işareti kaldırdım ve sonuç istendiği gibi oldu.
Zakher Masri

2

Bir değişkenin garip olup olmadığını test etmeniz gerektiğinde, önce tamsayı olup olmadığını test etmelisiniz . Ayrıca, negatif sayıdaki kalanları hesapladığınızda sonucun negatif ( -3 % 2 === -1) olacağını unutmayın .

function isOdd(value) {
  return typeof value === "number" && // value should be a number
    isFinite(value) &&                // value should be finite
    Math.floor(value) === value &&    // value should be integer
    value % 2 !== 0;                  // value should not be even
}

Number.isInteger varsa, bu kodu aşağıdakiler için basitleştirebilirsiniz:

function isOdd(value) {
  return Number.isInteger(value)      // value should be integer
    value % 2 !== 0;                  // value should not be even
}

Not: Burada, value % 2 !== 0bunun yerine value % 2 === 1nedeniyle test ediyoruz -3 % 2 === -1. -1Bu testi geçmek istemiyorsanız , bu satırı değiştirmeniz gerekebilir.

İşte bazı test örnekleri:

isOdd();         // false
isOdd("string"); // false
isOdd(Infinity); // false
isOdd(NaN);      // false
isOdd(0);        // false
isOdd(1.1);      // false
isOdd("1");      // false
isOdd(1);        // true
isOdd(-1);       // true

2

Kullanmak %bunu yapmanıza yardımcı olacaktır ...

Bunu sizin için yapmak için birkaç işlev oluşturabilirsiniz ... Ben böyle numara Javascript'te bağlı olmayan ve aynı zamanda sayı geçip geçmediğini kontrol eden ayrı işlevleri tercih ederim:

Tek işlev:

var isOdd = function(num) {
  return 'number'!==typeof num ? 'NaN' : !!(num % 2);
};

çift ​​işlev:

var isEven = function(num) {
  return isOdd(num)==='NaN' ? isOdd(num) : !isOdd(num);
};

ve şöyle deyin:

isOdd(5); // true
isOdd(6); // false
isOdd(12); // false
isOdd(18); // false
isEven(18); // true
isEven('18'); // 'NaN'
isEven('17'); // 'NaN'
isOdd(null); // 'NaN'
isEven('100'); // true

2

ES6'da bir astar temiz olduğu için.

const isEven = (num) => num % 2 == 0;


2

Birçok insan tuhaf anlamını yanlış anlıyor

  • isOdd("str")yanlış olmalı.
    Yalnızca bir tam sayı tuhaf olabilir.
  • isOdd(1.223)ve isOdd(-1.223)yanlış olmalı.
    Kayan nokta bir tamsayı değildir.
  • isOdd(0)yanlış olmalı.
    Sıfır, eşit bir tamsayıdır ( https://en.wikipedia.org/wiki/Parity_of_zero ).
  • isOdd(-1)doğru olmalı.
    Bu tuhaf bir tam sayı.

Çözüm

function isOdd(n) {

  // Must be a number
  if (isNaN(n)) {
    return false;
  }

  // Number must not be a float
  if ((n % 1) !== 0) {
    return false;
  }

  // Integer must not be equal to zero
  if (n === 0) {
    return false;
  }

  // Integer must be odd
  if ((n % 2) !== 0) {
    return true;
  }

  return false;
}

JS Fiddle (gerekirse): https://jsfiddle.net/9dzdv593/8/

1-astar

Javascript 1-astar çözümü. Okunabilirliği umursamayanlar için.

const isOdd = n => !(isNaN(n) && ((n % 1) !== 0) && (n === 0)) && ((n % 2) !== 0) ? true : false;

Çözümü henüz hızlandırabilirsiniz. yani, son ifadelerde geri dönebilirsiniz !! (n% 2), bu isteğe bağlı olarak imzalı sayılarla çalışacaktır (yani, n% 2 0 döndürdüğünde yanlıştır, ancak -1 veya 1 döndüğünde, bu true değerini döndür). Çözümünüz aslında tek sayılar için yanlış döndürüyor, çünkü modül dönüşünün 0 olup olmadığını kontrol ediyor, ancak 1'i kontrol etmeli ve 1 negatif sayılar için başarısız olur, bu nedenle geri dönüş !! (n% 2) daha güvenlidir. Her neyse, {} (blok ifadesi) küçültme sorunlarına neden olmaz ve tartışmada yer almaz.
Hydroper

@TheProHands - Notlar için teşekkürler. (1) Sorun, Modül Versiyonunun bir yazım hatası olmasıydı; (n % 2) !== 0yerine olması gerekirdi (n % 2) === 0. (2) Benim tavsiyem kaçınmaktır !!(n % 2)(a) daha yavaş performansa sahip olduğundan, (n % 2) !== 0( jsperf.com/notnot-vs-strict-not ), (b) bir hack - bu bir Falsey değerini coerces 0içine false, ve (c) karanlık (yüksek seviyeli programlama dilleri performans uğruna Pascal gibi okunmamalıdır - bu derleyicinin işi). (3) Evet, eksik {}blok ifadeleri çeşitli sorunlara neden olur (cevabımda güncellendiği gibi).
tfmontague

Okunabilirliği önemsediğim için asla blok ifadelerden kaçınmam, ancak blok ifadeleri aramanın sorunlara neden olmadığını, sadece kod sürdürme ile ilgili olduğunu söylemeye çalışıyorum. Yani, blok ifadesi yerine ifade ifadesi ile birleştirilmiş sıra ifadeleri kullanmak kodu okunamaz ve çirkin yapabilir, yani:, if (0) call1(), assign = 0, call2()ama tek bir ifade kötü değil: if (0) return; if (0) ;; if (0); break; if (0) continue;ve yine de ben kesme satır bloğu deyimlerini kullanmaya devam etmeyi tercih ederim uzun satır içi koşullar.
Hydroper

Kız kardeşin gibi türü / boş çekler isNaN(n)saçma - emin kaplı NaNdurumda, ancak isOdd(null), isOdd(undefined), isOdd({x:1})bütün dönüş falsebir hata olduğunu düşündüğümüz; tabii ki sadece fonksiyonunuzun belirli bir alan üzerinde doğru davranışa sahip olduğunu belirtmiyorsanız: sadece Sayı-tipi girdiler. Bu durumda, isNaNonay kutusunu bırakın ve kullanıcıyı doğru türle aramaya zorlayın. Defansif programlama korkunç. Daha sonra fonksiyonunuz basitleştirilir isOdd = x => Math.floor(x) === x && x & 1 === 1- müstehcen dönüş trueveya falsedeğerler gerekli değildir
Teşekkür ederim

null, undefinedve nesneler {}tek tamsayı değildir ve bu nedenle işlev döner false- neden bir hata olduğunu düşündüğünüzden emin değilsiniz. isNaNÇek, diğer kontroller yapılmadan erken fonksiyon çıkış sağlayan (değil savunma için) performansına ilişkindir.
tfmontague

1

Bunu bir boole döndürmek için uygularım:

function isOdd (n) {
    return !!(n % 2);
    // or ((n % 2) !== 0).
}

Hem imzasız hem de imzalı sayılar üzerinde çalışır. Modül döndüğünde -1ya 1da çevrilince true.

Modül olmayan çözelti:

var is_finite = isFinite;
var is_nan = isNaN;

function isOdd (discriminant) {
    if (is_nan(discriminant) && !is_finite(discriminant)) {
        return false;
    }

    // Unsigned numbers
    if (discriminant >= 0) {
        while (discriminant >= 1) discriminant -= 2;

    // Signed numbers
    } else {
        if (discriminant === -1) return true;
        while (discriminant <= -1) discriminant += 2;
    }

    return !!discriminant;
}

1

Modern javascriptte daha işlevsel bir yaklaşım:

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

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

1

ES6'da:

const isOdd = num => num % 2 == 1;


3
Sekiz yaşındaki bir soruya mevcut 26 cevapla bir cevap eklerken, cevabınızın hangi yeni yönünü ele aldığını ve zamanın ve yeni versiyonların geçişinin cevabı etkileyip etkilemediğini açıklamak gerçekten yararlıdır. Sadece bir kod yanıtı hemen hemen her zaman bazı açıklamalar eklenerek geliştirilebilir ve bu durumda bazı örnek kullanımları gösterir.
Jason Aller

1
başlık 'JavaScript'te bir sayının garip olup olmadığını belirleme' şeklindedir ve sorulanlar için ES6 çözümü yayınlanmamıştır.
Darryl Mendonez

0

Üçlü operatör kullanarak tek çift sayıları bulabiliriz:

var num = 2;
result = (num % 2 == 0) ? 'even' : 'odd'
console.log(result);


0

bu diziler için çalışır:

function evenOrOdd(numbers) {
  const evenNumbers = [];
  const oddNumbers = [];
  numbers.forEach(number => {
    if (number % 2 === 0) {
      evenNumbers.push(number);
    } else {
      oddNumbers.push(number);
    }
  });

  console.log("Even: " + evenNumbers + "\nOdd: " + oddNumbers);
}

evenOrOdd([1, 4, 9, 21, 41, 92]);

çıkış yapmalı: 4,92 1,9,21,41

sadece bir numara için:

function evenOrOdd(number) {
  if (number % 2 === 0) {
    return "even";
  }

  return "odd";
}

console.log(evenOrOdd(4));

bu bile konsola gönderilmelidir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.