Controlla se il numero è pari o dispari


128

Come determinerei se un determinato numero è pari o dispari? Ho voglia di capirlo da molto tempo ormai e non sono arrivato da nessuna parte.

Risposte:


201

È possibile utilizzare l'operatore modulo, ma può essere lento. Se è un numero intero, puoi fare:

if ( (x & 1) == 0 ) { even... } else { odd... }

Questo perché il bit basso verrà sempre impostato su un numero dispari.


23
Mi stupisce ancora che la gente preferisca il modulo al semplice controllo del primo bit del numero. Ovviamente se viene impostato il primo bit, il numero deve essere dispari. Di solito è più veloce, e legge altrettanto bene secondo me. Penso che il motivo per cui gli altri non lo preferiscono al modulo dipende dalla mancanza di comprensione del binario.
schiaccia il

5
@dtech Penso che tu abbia frainteso il significato dell'ottimizzazione prematura. Se sai in anticipo che un metodo è più performante di un altro, allora non è ottimizzazione prematura usare il metodo più performante. È intelligente. Detto questo, il mio commento era più su come il controllo del primo bit sia più logico che sull'uso del modulo quando si controlla semplicemente pari / dispari. Il problema è che molti programmatori non capiscono cosa faccia uno dei due metodi e seguono semplicemente i tutorial.
schiaccia

54
@crush n % 2 == 0significa semanticamente Divide by 2 and check if the remainder is 0, il che è molto più chiaro di ciò n & 1 == 0che significa Zero all the bits but leave the least significant bit unchanged and check if the result is 0. La maggiore chiarezza del primo vale il sovraccarico (probabilmente inesistente). Questo è ciò che intendevo con ottimizzazione prematura. Se qualcosa è lento e si profilo it in quella parte che cambia n % 2a n & 1è certamente giustificato, ma farlo in anticipo non è. In generale, lavorare con gli operatori di bit è una cattiva idea prima della profilazione.
dtech,

18
@dtech Prima di tutto, la tua opinione è completamente soggettiva. In secondo luogo, non capisci ancora cosa significhi "ottimizzazione prematura". È una micro ottimizzazione, certo. Non è un'ottimizzazione prematura. L'ottimizzazione prematura sta rivedendo il codice esistente con "ottimizzazioni" senza prima profilare il codice esistente per vedere che è inefficiente. Tuttavia, sapere in anticipo che scrivere il codice in un modo anziché in un altro è più efficiente e scegliere di utilizzare il codice più efficiente NON è un'ottimizzazione prematura. È la tua opinione soggettiva che n % 2 == 0è più pulita di n & 1 == 0.
cotta

15
Vorrei solo sottolineare per le persone che vengono qui che usare l'operatore modulo va bene, ma se lo stai usando per testare la stranezza, scrivi n% 2! = 0, non n% 2 == 1, perché quest'ultimo non funziona con numeri negativi in ​​Java.
Jxek,

98
if((x%2)==0)
   // even
else
   // odd

30

Se il resto quando dividi per 2 è 0, è pari. %è l'operatore per ottenere un resto.


12
L'operatore% si chiama modulo.
Anthony,

4
@Anthony: In realtà, è l ' "operatore residuo" .
Ryan Stewart,

3
Il termine matematico è modulo e ha un'applicabilità più ampia rispetto al resto. (A % B)stesso può essere usato come espressione, ed è allora che le cose si divertono.
Stefan Kendall,

2
@Stefan: non tratterò il punto, ma i matematici tendono a sottolineare che nell'aritmetica modulare il modulo e il resto non sono la stessa cosa .
Ryan Stewart,

2
@StefanKendall Controlla la specifica del linguaggio Java 15.17.3 . Google non è un riferimento normativo.
Marchese di Lorne,

24

L'operatore residuo,%, ti darà il resto dopo aver diviso per un numero.

Quindi n % 2 == 0sarà vero se n è pari e falso se n è dispari.


21

Ogni numero pari è divisibile per due, indipendentemente dal fatto che sia un decimale (ma anche il decimale, se presente, deve essere pari). Quindi puoi usare l' %operatore (modulo), che divide il numero a sinistra per il numero a destra e restituisce il resto ...

boolean isEven(double num) { return ((num % 2) == 0); }

1
'Indipendentemente dal fatto che sia un decimale' non ha senso. Il decimale è una radice. Vuoi dire 'contiene una parte frazionaria'?
Marchese di Lorne,

4

io raccomanderei

Puzzle di Java: trappole, insidie ​​e casse d'angolo di Joshua Bloch e Neal Gafter

Vi è una breve spiegazione su come verificare se il numero è dispari. Il primo tentativo è qualcosa di simile a quello che ha provato @AseemYadav:

public static boolean isOdd(int i) {
     return i % 2 == 1;
}

ma come è stato menzionato nel libro:

quando l'operazione rimanente restituisce un risultato diverso da zero, ha lo stesso segno dell'operando di sinistra

quindi generalmente quando abbiamo un numero dispari negativo, allora invece di 1ottenere -1come risultato i%2. Quindi possiamo usare la soluzione @Camilo o semplicemente fare:

public static boolean isOdd(int i) {
     return i % 2 != 0;
}

ma generalmente la soluzione più veloce sta usando l'operatore AND come @lucasmo scrivi sopra:

public static boolean isOdd(int i) {
     return (i & 1) != 0;
}

@Edit Vale anche la pena di indicare Math.floorMod(int x, int y);quale è il risultato positivo del dividendo, ma può anche tornare -1se il divisore è negativo


2

Funziona con numeri positivi o negativi

int start = -3;
int end = 6;

for (int val = start; val < end; val++)
{
    // Condition to Check Even, Not condition (!) will give Odd number
    if (val % 2 == 0) 
    {
        System.out.println("Even" + val);
    }
    else
    {
        System.out.println("Odd" + val);
    }
}

2

Il bit meno significativo (all'estrema destra) può essere utilizzato per verificare se il numero è pari o dispari. Per tutti i numeri dispari, il bit più a destra è sempre 1 nella rappresentazione binaria.

public static boolean checkOdd(long number){
   return ((number & 0x1) == 1);
}

2

Il seguente programma può gestire numeri grandi (numero di cifre maggiore di 20)

package com.isEven.java;
import java.util.Scanner;

public class isEvenValuate{

public static void main(String[] args) {            

        Scanner in = new Scanner(System.in);
        String digit = in.next();

        int y = Character.getNumericValue(digit.charAt(digit.length()-1));

        boolean isEven = (y&1)==0;

        if(isEven)
            System.out.println("Even");
        else
            System.out.println("Odd");

    }
}

Ecco l'output ::

  122873215981652362153862153872138721637272
  Even

1

È possibile utilizzare l'operatore modulo, ma può essere lento. Un modo più efficiente sarebbe quello di controllare il bit più basso perché questo determina se un numero è pari o dispari. Il codice sarebbe simile al seguente:

public static void main(String[] args) {        
    System.out.println("Enter a number to check if it is even or odd");        
    System.out.println("Your number is " + (((new Scanner(System.in).nextInt() & 1) == 0) ? "even" : "odd"));        
}

1

Puoi fare così:

boolean is_odd(int n) {
    return n % 2 == 1 || n % 2 == -1;
}

Questo perché Java ha nella sua operazione modulo il segno del dividendo, il lato sinistro: n. Quindi per i dividendi negativi e positivi, il modulo ne ha il segno.

Naturalmente, l'operazione bit a bit è più veloce e ottimizzata, è sufficiente documentare la riga di codice con due o tre parole brevi, che lo fa per leggibilità.


Si chiama operatore residuo , non operatore modulo.
Marchese di Lorne,

1

Un altro modo semplice per farlo senza usare la condizione if / else (funziona sia per i numeri positivi che per quelli negativi):

int n = 8;
List<String> messages = Arrays.asList("even", "odd");

System.out.println(messages.get(Math.abs(n%2)));

Per un numero dispari, l'espressione restituirà '1' come resto, dando

message.get (1) = 'dispari' e quindi stampa 'dispari'

in caso contrario, viene stampato 'pari' quando l'espressione presenta il risultato '0'


1
Questa domanda è stata etichettata come JAVA. Hai pubblicato una risposta in Python. Non molto utile davvero.
Segna il

Ehi @Mark! Grazie per averlo sottolineato, modificato la risposta. Spero che questa volta possa ancora essere d'aiuto a qualcuno.
Aseem Yadav,

1
Può essere facilmente arrestato per esempio: int n = -3;. Come @Camilo menzionato di seguito - quando l'operazione rimanente restituisce un risultato diverso da zero, ha lo stesso segno dell'operando di sinistra in modo così generoso che abbiamo System.out.println(messages.get(-1));ciò che ci dàjava.lang.ArrayIndexOutOfBoundsException
Michu93

1

Se il modulo di un determinato numero è uguale a zero, il numero è pari al numero dispari. Di seguito è riportato il metodo per farlo:

public void evenOrOddNumber(int number) {
  if (number % 2 == 0) {
    System.out.println("Number is Even");
   } else {
    System.out.println("Number is odd");
  }
 }

0
package isevenodd;
import java.util.Scanner;
public class IsEvenOdd {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter number: ");
        int y = scan.nextInt();       
        boolean isEven = (y % 2 == 0) ? true : false;
        String x = (isEven) ? "even" : "odd";  
        System.out.println("Your number is " + x);
    }
}

Qual è lo scopo di "?" segno
Rana Talha Tariq

0

Ecco un esempio per determinare se un determinato numero è pari o dispari,

import java.util.Scanner;

public class EvenOdd
{
   public static void main(String[] args)
   {
      int a;
      System.out.println("Please enter a number to check even or odd:");
      Scanner sc = new Scanner(System.in);
      a = sc.nextInt();

      if(a % 2 == 0)
      {
         System.out.println("Entered number is an even number");
      }
      else
      {
         System.out.println("Entered number is an odd number");
      }
   }
}

Bene, ci sono molti modi per determinare lo stesso. Fare riferimento a questa risorsa per ulteriori esempi per trovare il numero dato pari o dispari.


0

Ecco un esempio completo: -

import java.text.ParseException;

public class TestOddEvenExample {
    public static void main(String args[]) throws ParseException {

        int x = 24;
        oddEvenChecker(x);

        int xx = 3;
        oddEvenChecker(xx);
    }

    static void oddEvenChecker(int x) {
        if (x % 2 == 0)
            System.out.println("You entered an even number." + x);
        else
            System.out.println("You entered an odd number." + x);
    }
}

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.