Periksa apakah angka genap atau ganjil


128

Bagaimana saya menentukan apakah angka yang diberikan genap atau ganjil? Saya sudah lama ingin mengetahui hal ini sejak lama dan belum pernah ke mana-mana.

Jawaban:


201

Anda dapat menggunakan operator modulus, tetapi itu bisa lambat. Jika bilangan bulat, Anda dapat melakukan:

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

Ini karena bit rendah akan selalu ditetapkan pada angka ganjil.


23
Masih mengherankan saya bahwa orang lebih suka modulus daripada hanya memeriksa bit pertama dari angka tersebut. Jelas jika bit pertama diatur, maka angkanya pasti ganjil. Ini biasanya lebih cepat, dan itu membaca juga menurut saya. Saya pikir alasan orang lain tidak lebih suka modulus karena kurangnya pemahaman tentang biner.
naksir

5
@dtech Saya pikir Anda salah paham arti optimasi prematur. Jika Anda tahu sebelumnya bahwa satu metode lebih berkinerja daripada yang lain, maka itu bukan optimasi prematur untuk menggunakan metode yang lebih berkinerja. Itu cerdas. Yang mengatakan, komentar saya lebih tentang bagaimana memeriksa bit pertama lebih logis daripada menggunakan modulus ketika hanya memeriksa genap / ganjil. Masalahnya adalah bahwa banyak programmer tidak mengerti apa metode yang dilakukan, dan hanya mengikuti tutorial.
naksir

54
@Crush n % 2 == 0semantik berarti Divide by 2 and check if the remainder is 0, yang jauh lebih jelas daripada n & 1 == 0artinya Zero all the bits but leave the least significant bit unchanged and check if the result is 0. Kejelasan yang ditingkatkan dari yang pertama sebanding dengan biaya overhead (mungkin tidak ada). Itulah yang saya maksud dengan optimasi prematur. Jika ada sesuatu yang lambat dan Anda memprofilkannya di bagian itu berubah n % 2menjadi n & 1dibenarkan, tetapi melakukannya sebelumnya tidak. Secara umum bekerja dengan operator bit adalah ide yang buruk sebelum membuat profil.
dtech

18
@dtech Pertama-tama, pendapat Anda sepenuhnya subjektif. Kedua, Anda masih tidak mengerti apa artinya "optimasi prematur". Itu adalah optimasi mikro, tentu saja. Ini bukan optimasi prematur. Optimalisasi prematur merevisi kode yang ada dengan "optimisasi" tanpa terlebih dahulu membuat profil kode yang ada untuk melihat bahwa itu tidak efisien. Namun, mengetahui sebelumnya bahwa menulis kode satu arah vs cara lain lebih efisien, dan memilih untuk menggunakan kode yang lebih efisien, BUKAN optimisasi prematur. Ini adalah pendapat subjektif Anda yang n % 2 == 0adalah bersih dari n & 1 == 0.
naksir

15
Saya hanya ingin menunjukkan kepada orang-orang yang datang ke sini bahwa menggunakan operator modulo baik-baik saja, tetapi jika Anda menggunakannya untuk menguji keanehan, tulis n% 2! = 0, bukan n% 2 == 1, karena yang terakhir tidak berfungsi untuk angka negatif di Jawa.
Jxek


30

Jika sisanya ketika Anda membagi 2 adalah 0, itu genap. %adalah operator untuk mendapatkan sisanya.


12
Operator% disebut modulo.
Anthony

4
@Anthony: Sebenarnya, itu adalah "operator sisa" .
Ryan Stewart

3
Istilah matematika adalah modulus, dan memiliki penerapan yang lebih luas daripada mendapatkan sisanya. (A % B)itu sendiri dapat digunakan sebagai ekspresi, dan saat itulah segalanya menjadi menyenangkan.
Stefan Kendall

2
@Stefan: Saya tidak akan mengulangi intinya, tetapi matematikawan cenderung menunjukkan bahwa dalam aritmatika modular , modulus dan sisanya bukan hal yang sama .
Ryan Stewart

2
@StefanKendall Periksa Spesifikasi Bahasa Jawa # 15.17.3 . Google bukan referensi normatif.
Marquis of Lorne

24

Operator sisanya,%, akan memberi Anda sisanya setelah membaginya dengan angka.

Jadi n % 2 == 0akan benar jika n genap dan salah jika n ganjil.


21

Setiap angka genap dapat dibagi dua, terlepas dari apakah itu desimal (tetapi desimal, jika ada, juga harus genap). Jadi Anda dapat menggunakan %operator (modulo), yang membagi angka di sebelah kiri dengan nomor di sebelah kanan dan mengembalikan sisanya ...

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

1
'Terlepas dari apakah itu desimal' tidak ada artinya. Desimal adalah radix. Apakah maksud Anda 'mengandung bagian pecahan'?
Marquis of Lorne

4

saya ingin merekomendasikan

Java Puzzlers: Traps, Pitfalls, and Corner Case Book oleh Joshua Bloch dan Neal Gafter

Ada penjelasan singkat tentang cara memeriksa apakah nomornya ganjil. Percobaan pertama adalah sesuatu yang serupa yang dicoba oleh @AseemYadav:

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

tetapi seperti yang disebutkan dalam buku:

ketika operasi sisanya mengembalikan hasil bukan nol, ia memiliki tanda yang sama dengan operan kirinya

jadi umumnya ketika kita memiliki angka ganjil negatif daripada sebagai ganti 1kita akan mendapatkan -1hasil i%2. Jadi kita bisa menggunakan solusi @Camilo atau hanya melakukan:

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

tetapi umumnya solusi tercepat menggunakan DAN operator seperti @ lucasmo tulis di atas:

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

@Edit Juga patut untuk menunjukkan Math.floorMod(int x, int y);yang berhubungan dengan negatif dividen tetapi juga dapat kembali -1jika pembagi negatif


2

Berfungsi untuk angka positif atau negatif

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

Sedikit yang tidak signifikan (paling kanan) dapat digunakan untuk memeriksa apakah jumlahnya genap atau ganjil. Untuk semua angka ganjil, bit paling kanan selalu 1 dalam representasi biner.

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

2

Program berikut ini dapat menangani jumlah besar (jumlah digit lebih besar dari 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");

    }
}

Ini outputnya ::

  122873215981652362153862153872138721637272
  Even

1

Anda dapat menggunakan operator modulus, tetapi itu bisa lambat. Cara yang lebih efisien adalah memeriksa bit terendah karena itu menentukan apakah angka genap atau ganjil. Kode akan terlihat seperti ini:

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

Anda bisa melakukan ini:

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

Ini karena Java memiliki dalam operasi modulo tanda dividen, sisi kiri: n. Jadi untuk dividen negatif dan positif, modulo memiliki tanda mereka.

Tentu saja, operasi bitwise lebih cepat dan optimal, cukup mendokumentasikan baris kode dengan dua atau tiga kata pendek, yang membuatnya mudah dibaca.


Ini disebut operator sisa , bukan operator modulo.
Marquis of Lorne

1

Cara mudah lain untuk melakukannya tanpa menggunakan kondisi if / else (berfungsi untuk bilangan positif dan negatif):

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

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

Untuk Aneh no., Ekspresi akan mengembalikan '1' sebagai sisa, memberi

messages.get (1) = 'aneh' dan karenanya mencetak 'aneh'

lain, 'genap' dicetak ketika ekspresi muncul dengan hasil '0'


1
Pertanyaan ini ditandai sebagai JAWA. Anda mengirim jawaban dengan Python. Tidak terlalu berguna.
Markus

Hai @Mark! Terima kasih telah menunjukkannya, edit jawabannya. Semoga, ini masih bisa membantu seseorang untuk saat ini.
Aseem Yadav

1
Hal ini dapat dengan mudah jatuh misalnya dengan: int n = -3;. Seperti @Camilo sebutkan di bawah ini - ketika operasi sisanya mengembalikan hasil bukan nol, ia memiliki tanda yang sama dengan operan kirinya begitu umum kami memiliki System.out.println(messages.get(-1));apa yang memberi kamijava.lang.ArrayIndexOutOfBoundsException
Michu93

1

Jika modulus bilangan yang diberikan sama dengan nol, bilangan itu bahkan bilangan ganjil. Di bawah ini adalah metode yang melakukan itu:

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

Apa tujuan dari '?' sign
Rana Talha Tariq

0

Berikut ini contoh untuk menentukan apakah angka yang diberikan genap atau ganjil,

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");
      }
   }
}

Nah, ada banyak cara untuk menentukan hal yang sama. Rujuk sumber ini untuk lebih banyak contoh untuk menemukan nomor yang diberikan genap atau ganjil.


0

Berikut ini contoh lengkapnya: -

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

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.