Jak ustalić, czy liczba jest nieparzysta w JavaScript

245

Czy ktoś może wskazać mi jakiś kod, aby ustalić, czy liczba w JavaScript jest parzysta czy nieparzysta?

Jannie Theunissen
źródło
1
@DavidThomas Częściowo się zgadzam, ale mam dwa zastrzeżenia: 1. Gdybym musiał wybrać, wolałbym, aby początkujący programista wiedział o %operatorze &, a także 2. Chociaż &teoretycznie jest szybszy, to naprawdę nie ma znaczenia .
kojiro
3
@kojiro: Wolę, aby uczący się przedstawił więcej (ważnych) opcji; do tego nigdy wcześniej nie myślałem, żeby używać bitowego - i w ten sposób, więc jest to interesujące ujęcie. W każdym razie, ponieważ jest to duplikat, zgłosiłem połączenie z wcześniej istniejącym pytaniem. Mamy nadzieję, że odpowiedzi tutaj (przynajmniej ta konkretna odpowiedź) nie zostaną utracone.
David mówi, że przywraca Monikę
1
@kojiro Boję się powiedzieć, że twoje skrzypce są dość bezużyteczne, ponieważ większość czasu obliczeniowego zajmują wywołania funkcji. Ale nikt nie użyje wywołania funkcji, aby ustalić, czy numer jest nieparzysty, czy nawet ... Zrobiłem trzecią wersję twojego testu, ale jestem teraz na telefonie ...
MaxArt

Odpowiedzi:

347

Użyj poniższego kodu:

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 oznacza liczbę nieparzystą, podczas gdy 0 oznacza liczbę parzystą.

Chii
źródło
97
Zauważ, że to zwróci 0lub 1(lub NaNjeśli podasz mu coś, co nie jest liczbą i nie da się go zmusić do uzyskania jednej), co zadziała w większości sytuacji. Ale jeśli chcesz prawdziwy truelub false:return (num % 2) == 1;
TJ Crowder
3
tak, dobra notatka na temat NaN. Ale zwykle chcesz, aby javascript był prawdomówny lub falsey, dlatego napisałem go tak, jak to zrobiłem.
Chii
9
Dla wyjaśnienia operator modulo (%) podaje pozostałą część podziału. Tak więc 3% 2 byłoby 3/2, pozostawiając 1 jako pozostałość, dlatego 3% 2 zwróci 1.
Abuh
6
Zgodnie z tym, co powiedział TJ, zwróci ułamek, jeśli numnie jest liczbą całkowitą. Co nadal będzie działać, jeśli porównasz isOdd(1.5)==true(ponieważ wartość ułamkowa nie jest równa true), ale byłoby lepiej, gdyby funkcja zwróciła truelub falsejak sugeruje nazwa „isOdd”.
nnnnnn
6
Możesz także zrobić return !!(num % 2)wartość logiczną
Duncan
115

Użyj ANDoperatora bitowego .

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>

Jeśli nie chcesz zwracanej wartości ciągu, a raczej wartości logicznej, użyj tego:

var isOdd = function(x) { return x & 1; };
var isEven  = function(x) { return !( x & 1 ); };
0x499602D2
źródło
5
+1, Twoja odpowiedź zdecydowanie bije moją, nie wspominając już o tym, że masz jedyną odpowiedź, której nie używa X % Y!
s0d4pop
4
Nie jestem pewien, czy mój test jest dokładny, ale bitowe AND wydaje się być 40 razy wolniejsze niż operator modulo dla stałej liczby i 2 razy wolniejsze dla liczby losowej: jsperf.com/odd-or-even
Blender
8
Zauważ, że to zwróci „nieparzyste” lub „parzyste” dla liczb, które nie są albo (np. 3.14).
nnnnnn
2
Lub: function isEven(n){return !(n & 1);}.
RobG
7
@Gnuey Każda liczba składa się z szeregu bitów. Wszystkie liczby nieparzyste mają najmniej znaczący (skrajnie prawy) bit ustawiony na 1, wszystkie liczby parzyste 0. x & 1Sprawdza, czy ostatni bit jest ustawiony na liczbę (ponieważ 1 to liczba z wszystkimi bitami ustawionymi na 1, z wyjątkiem najmniej znaczącego bitu ): Jeśli to jest liczba jest nieparzysta, w przeciwnym razie nawet.
0x499602D2,
31

Możesz zrobić coś takiego:

function isEven(value){
    if (value%2 == 0)
        return true;
    else
        return false;
}
TNC
źródło
9
Wygląda na to, że nie wiesz, czym jest wartość logiczna. if (condition) { answer=true; } else { answer=false; }jest po prostu niepotrzebnie mylącą wersją answer = (bool) condition;. Zmniejsz swoją funkcję do, function isEven(value) { return (bool) (value%2 == 0); }a wszyscy będziemy szczęśliwi.
awm
9
Nie musisz się denerwować, bo programuję coś inaczej.
TNC
5
@awm - Wygląda na to , że nie znasz JavaScript. Nie możesz rzutować na boolean za pomocą (bool)( spowoduje to błąd), aw każdym razie nie musisz: return value%2 == 0;wykona zadania, ponieważ ==operator zwraca boolean.
nnnnnn
2
Wow, czy naprawdę to napisałem? Tak, to oczywiście źle; powinno być coś w rodzaju answer = !!(condition). Rzecz, o której starałem się oczywiście powiedzieć, to, że możesz po prostu return value%2==0i nie musisz zawracać sobie głowy warunkami.
awm
Uważam to za eleganckie: value%2===0
carlodurso
17
function isEven(x) { return (x%2)==0; }
function isOdd(x) { return !isEven(x); }
CloudyMarble
źródło
13

Czy muszę zrobić tablicę naprawdę dużą, która ma wiele liczb parzystych

Nie. Użyj modułu (%). Daje ci resztę dwóch liczb, które dzielisz.

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.

Oznacza to, że jeśli zmodyfikujesz dowolną liczbę x o 2, otrzymasz 0, 1 lub -1. 0 oznacza, że ​​jest parzysta. Wszystko inne oznaczałoby, że to dziwne.

Isaac Fife
źródło
8

Można to rozwiązać za pomocą małego fragmentu kodu:

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

Mam nadzieję że to pomoże :)

s0d4pop
źródło
6

Podobnie jak wiele języków, Javascript ma operator modułu% , który znajduje resztę podziału. Jeśli nie ma reszty po podzieleniu przez 2, liczba jest parzysta:

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

Jest to bardzo powszechny idiom do testowania nawet liczb całkowitych.

pb2q
źródło
3
Jednak moduł może być trudny / niezdefiniowany dla wartości ujemnych. Pamiętaj, aby zapoznać się z odpowiednią specyfikacją języka.
6

Z bitowym kodowaniem:

var isEven=n=>(n&1)?"odd":"even";
Katia Punter
źródło
5

Prosta funkcja, którą możesz przekazać. Używa operatora modulo %:

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

is_even(3)
false
is_even(6)
true
dgh
źródło
1
Jeśli wyniki w potrójnym operatorze są „prawdziwe” lub „fałszywe”, naprawdę nie potrzebujesz operatora potrójnego. Tutaj możesz / powinieneś po prostu:return !(x % 2);
dom_watson
4

Użyj moich rozszerzeń:

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

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

następnie

var a=5; 
 a.isEven();

== Fałsz

 a.isOdd();

== Prawda

jeśli nie masz pewności, czy jest to liczba, przetestuj ją, wykonując następujące rozgałęzienia:

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

AKTUALIZACJA :

jeśli nie używałbyś zmiennej:

(5).isOdd()

Występ :

Okazuje się, że paradygmat proceduralny jest lepszy niż paradygmat OOP. Nawiasem mówiąc, przeprowadziłem profilowanie w tym FIDDLE . Jednak sposób OOP jest nadal najładniejszy.

wprowadź opis zdjęcia tutaj

Abdennour TOUMI
źródło
Dzięki koleś, za tę logikę, w wywiadzie ktoś zapytał o taką logikę, nie mógł odpowiedzieć, teraz rozumiem, dziękuję .. ale czy jest jakaś korzyść z wydajności, stosując tę ​​metodę? moglibyśmy napisać isEven (x); itd.
Shoib Mohammed A
@ShoibMohammedA: Porównanie zostało wykonane! jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI
-1 nie rozszerzają natywnych funkcji prototypowych. ( stackoverflow.com/questions/14034180/… )
tfmontague
3

Odejmij 2 rekurencyjnie, aż osiągniesz -1 lub 0 (oczywiście działa tylko dla dodatnich liczb całkowitych) :)

asymetryczny
źródło
Z liczbami ujemnymi zamiast tego zwiększasz do niego 2
Hydroper
I zajmuje to cholernie dużo czasu, gdy n = 2 ^ 52, i nieskończoną ilość dla n> 2 ^ 53
rioV8
3

Możesz użyć instrukcji for i warunku, aby ustalić, czy liczba lub seria liczb jest nieparzysta:

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

Spowoduje to wydrukowanie każdej liczby nieparzystej od 1 do 5.

bezczelny drań
źródło
3

Właśnie wykonałem ten w Adobe Dreamweaver .. działa idealnie. użyłem if (isNaN (mynmb))

aby sprawdzić, czy podana wartość jest liczbą, czy nie, a także użyłem Math.abs (mynmb% 2) do konwersji liczby ujemnej na dodatnią i obliczenia

    <!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>
Srivastav
źródło
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>
Kirandeep Singh
źródło
2
if (X % 2 === 0){
} else {
}

Zamień X na swój numer (może pochodzić ze zmiennej). Instrukcja If działa, gdy liczba jest parzysta, a Else, gdy jest nieparzysta.

Jeśli chcesz tylko wiedzieć, czy dana liczba jest nieparzysta:

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

Ponownie zamień X na liczbę lub zmienną.

Gui Premonsa
źródło
2

Każda liczba nieparzysta podzielona przez dwa liście pozostawia jako 1, a każda liczba parzysta podzielona przez zero pozostawia zero jako resztę. Dlatego możemy użyć tego kodu

  function checker(number)  {
   return number%2==0?even:odd;
   }
Augusta Franciszka
źródło
2

Co powiesz na to...

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

    alert(aa[num % 2]);
AndroidManifester
źródło
2

Oto co zrobiłem

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

Z jakiegoś powodu musiałem się upewnić, że długość tablicy jest mniejsza o jeden. Gdy tego nie robię, „niezdefiniowany” staje się w ostatnim elemencie tablicy oddNumbers.

Zakher Masri
źródło
2
Jest tak, ponieważ warunek jest ustawiony na mniejszą lub równą „<=” długości tablicy. Usunąłem znak równości i wynik był zgodny z oczekiwaniami.
Zakher Masri
2

Kiedy musisz sprawdzić, czy jakaś zmienna jest nieparzysta, najpierw sprawdź, czy jest ona liczbą całkowitą . Zwróć też uwagę, że podczas obliczania reszty na liczbie ujemnej wynik będzie ujemny ( -3 % 2 === -1).

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
}

Jeśli Number.isInteger jest dostępny, możesz również uprościć ten kod, aby:

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

Uwaga: tutaj testujemy value % 2 !== 0zamiast z value % 2 === 1powodu -3 % 2 === -1. Jeśli nie chcesz -1przejść tego testu, może być konieczna zmiana tego wiersza.

Oto kilka przypadków testowych:

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
tsh
źródło
2

Za pomocą % pomoże ci to zrobić ...

Możesz stworzyć dla siebie kilka funkcji ... Wolę osobne funkcje, które nie są dołączone do Number w JavaScript, takie jak ta, która sprawdza również, czy przekazujesz numer, czy nie:

funkcja nieparzysta:

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

nawet funkcja:

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

i nazwij to tak:

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
Alireza
źródło
2

Jedna wkładka w ES6 tylko dlatego, że jest czysta.

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

damdeez
źródło
2

Wiele osób źle rozumie znaczenie nieparzystości

  • isOdd("str")powinno być fałszywe.
    Tylko liczba całkowita może być nieparzysta.
  • isOdd(1.223)i isOdd(-1.223)powinno być fałszywe.
    Liczba zmiennoprzecinkowa nie jest liczbą całkowitą.
  • isOdd(0)powinno być fałszywe.
    Zero to parzysta liczba całkowita ( https://en.wikipedia.org/wiki/Parity_of_zero ).
  • isOdd(-1)powinno być prawdą.
    To dziwna liczba całkowita.

Rozwiązanie

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 (w razie potrzeby): https://jsfiddle.net/9dzdv593/8/

1-liniowy

JavaScript 1-liniowy. Dla tych, którzy nie dbają o czytelność.

const isOdd = n => !(isNaN(n) && ((n % 1) !== 0) && (n === 0)) && ((n % 2) !== 0) ? true : false;
tfmontague
źródło
Możesz jeszcze przyspieszyć rozwiązanie. tzn. w końcowych instrukcjach możesz po prostu zwrócić !! (n% 2), to opcjonalnie sprawi, że będzie działać z liczbami ze znakiem (tj. gdy n% 2 zwróci 0, jest to fałsz, ale gdy zwróci -1 lub 1, to return true). Twoje rozwiązanie faktycznie zwraca false dla liczb nieparzystych, ponieważ sprawdza, czy moduł zwraca 0, ale powinien sprawdzić dla 1, a 1 nie powiedzie się dla liczb ujemnych, więc powrót !! (n% 2) jest bezpieczniejszy. W każdym razie {} (instrukcja blokowa) nie powoduje problemów z minifikacją i nie jest obecna w dyskusji.
Hydroper
@TheProHands - Dzięki za notatki. (1) Problem polegał na tym, że wersja Modulus miała literówkę; powinno być (n % 2) !== 0zamiast (n % 2) === 0. (2) Moja rada jest, aby unikać !!(n % 2), ponieważ (a) ma mniejszą wydajność niż (n % 2) !== 0( jsperf.com/notnot-vs-strict-not ), (b) to hack - to wymusza wartość falsey 0się false, oraz (c) jest niejasny (języki programowania wysokiego poziomu nie powinny czytać jak Pascal ze względu na wydajność - to zadanie kompilatora). (3) Tak, brakujące {}instrukcje blokowe powodują kilka problemów (zaktualizowanych w mojej odpowiedzi).
tfmontague
Nigdy nie unikam instrukcji blokowych, ponieważ zależy mi na czytelności, ale staram się powiedzieć, że wyszukiwanie instrukcji blokowych nie powoduje problemów, a jedynie utrzymanie kodu. Tzn. Użycie wyrażeń sekwencyjnych połączonych z wyrażeniem wyrażeniowym zamiast wyrażenia blokowego może spowodować, że kod będzie nieczytelny i brzydki, tj .: if (0) call1(), assign = 0, call2(), ale jedno zdanie nie jest złe: if (0) return; if (0) ;; if (0); break; if (0) continue;i w każdym razie wolę nadal używać oświadczeń blokowych linii podziału, gdy warunki o długich rzędach.
Hydroper
Kontrole typ / null jak twój isNaN(n)są głupie - na pewno dotyczyło NaNsprawy, ale isOdd(null), isOdd(undefined), isOdd({x:1})wszystko zwrot falsektóre uważam za błąd; chyba że oczywiście określasz tylko, że funkcja ma poprawne zachowanie w danej domenie: tylko dane liczbowe. W takim przypadku po prostu upuść isNaNczek i zmuś użytkownika do wywołania go odpowiednim typem. Programowanie obronne jest okropne. Wtedy twoja funkcja jest uproszczona do isOdd = x => Math.floor(x) === x && x & 1 === 1- zwracanie jawnych truelub falsewartości nie jest konieczne
Dziękuję
null, undefineda obiekty {}nie są nieparzystymi liczbami całkowitymi, dlatego funkcja zwraca false- nie wiem, dlaczego uważasz to za błąd. isNaNWyboru jest do wykonania (nie do obrony), pozwala na wyjście funkcji przedwcześnie bez wykonywania innych czynności.
tfmontague
1

Zaimplementowałbym to, aby zwrócić wartość logiczną:

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

Będzie działać zarówno na liczbach niepodpisanych, jak i podpisanych. Kiedy moduł powróci -1lub 1zostanie przetłumaczony natrue .

Rozwiązanie niemodułowe:

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;
}
Hydroper
źródło
1

Bardziej funkcjonalne podejście we współczesnym javascript:

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)
Gunn
źródło
1

w ES6:

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

Darryl Mendonez
źródło
3
Dodając odpowiedź do ośmioletniego pytania z 26 istniejącymi odpowiedziami, naprawdę warto wyjaśnić, jaki nowy aspekt pytania dotyczy twoich odpowiedzi oraz czy upływ czasu i nowe wersje mają wpływ na odpowiedź. Odpowiedź tylko na kod można prawie zawsze poprawić, dodając pewne wyjaśnienia, aw tym przypadku niektóre przykładowe wywołania pokazujące użycie.
Jason Aller
1
tytuł brzmi „Jak ustalić, czy liczba jest nieparzysta w JavaScript” i nie podano rozwiązania ES6 dla tego, o co pytano.
Darryl Mendonez
0

Korzystając z operatora trójskładnikowego, możemy znaleźć nieparzyste liczby parzyste:

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

Mahendra Kulkarni
źródło
0

działa to na tablice:

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

to powinno się wylogować: 4,92 1,9,21,41

tylko dla liczby:

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

  return "odd";
}

console.log(evenOrOdd(4));

powinno to wypisać nawet na konsolę

JuicY_Burrito
źródło