Sayının çift mi yoksa tek mi olduğunu kontrol edin


129

Belirli bir sayının çift mi yoksa tek mi olduğunu nasıl anlarım? Bunu uzun zamandır çözmek istiyordum ve hiçbir yere varamadım.

Yanıtlar:


202

Modül işlecini kullanabilirsiniz, ancak bu yavaş olabilir. Tam sayı ise şunları yapabilirsiniz:

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

Bunun nedeni, düşük bitin her zaman tek sayıya ayarlanacak olmasıdır.


23
İnsanların sayının ilk bitini kontrol etmektense modülü tercih etmeleri beni hala şaşırtıyor. Açıktır ki, ilk bit ayarlanmışsa, sayı tek olmalıdır. Genellikle daha hızlıdır ve bence de aynı şekilde okur. Sanırım başkalarının modülü yerine tercih etmemesinin sebebi, ikiliyi anlama eksikliğinden kaynaklanıyor.
ezmek

5
@dtech Erken optimizasyonun anlamını yanlış anladığınızı düşünüyorum. Önceden bir yöntemin diğerinden daha performanslı olduğunu biliyorsanız, o zaman daha performanslı yöntemi kullanmak için erken optimizasyon olmaz. Zekice. Bununla birlikte, benim yorumum, ilk biti kontrol etmenin, basitçe çift / tek için kontrol ederken modül kullanmaktan daha mantıklı olduğu hakkındaydı. Sorun şu ki, birçok programcı her iki yöntemin de ne yaptığını anlamıyor ve sadece öğreticileri takip ediyor.
ezmek

54
@crush n % 2 == 0semantik aracı Divide by 2 and check if the remainder is 0daha net daha uzun olduğu, n & 1 == 0anlamına gelir Zero all the bits but leave the least significant bit unchanged and check if the result is 0. İlkinin iyileştirilmiş netliği, (muhtemelen mevcut olmayan) ek yüke değer. Erken optimizasyonla kastettiğim buydu. Şey yavaş ve değişen bu bölümünde bunu profil ise n % 2hiç n & 1kuşkusuz haklı, ancak önceden bunu yapıyor değil. Genel olarak, profil oluşturmadan önce bit operatörleriyle çalışmak kötü bir fikirdir.
dtech

18
@dtech Her şeyden önce, fikriniz tamamen öznel. İkincisi, "erken optimizasyon" un ne anlama geldiğini hala anlamıyorsunuz. Elbette bu bir mikro optimizasyon. Erken bir optimizasyon değil. Erken optimizasyon, mevcut kodu, verimsiz olduğunu görmek için önce mevcut kodun profilini çıkarmadan "optimizasyonlar" ile revize etmektir. Bununla birlikte, önceden bir şekilde kod yazmanın daha verimli olduğunu bilmek ve daha verimli kodu kullanmayı seçmek erken optimizasyon DEĞİLDİR. Bundan n % 2 == 0daha temiz olan öznel görüşünüzdür n & 1 == 0.
ezmek

15
Buraya gelen insanlara, modulo operatörünü kullanmanın iyi olduğunu belirtmek isterim, ancak tuhaflığı test etmek için kullanıyorsanız, n% 2! = 0 yazın, n% 2 == 1 değil, çünkü ikincisi Java'da negatif sayılar için çalışmaz.
Jxek


30

2'ye böldüğünüzde kalan 0 ise, çifttir. %kalan almak için operatördür.


12
% Operatörü modulo olarak adlandırılır.
Anthony

4
@Anthony: Aslında "kalan operatör" .
Ryan Stewart

3
Matematiksel terim modüldür ve geri kalanını elde etmekten daha geniş uygulanabilirliğe sahiptir. (A % B)kendisi bir ifade olarak kullanılabilir ve işte o zaman işler eğlenceli hale gelir.
Stefan Kendall

2
@Stefan: Konuya değinmeyeceğim, ancak matematikçiler modüler aritmetikte modül ve geri kalanın aynı şey olmadığını belirtme eğilimindedir .
Ryan Stewart

2
@StefanKendall Java Dil Spesifikasyonunu Kontrol Edin # 15.17.3 . Google, normatif bir referans değildir.
Marquis of Lorne

24

Kalan operatörü,%, bir sayıya böldükten sonra kalanı size verecektir.

Öyleyse n % 2 == 0n çiftse doğru ve n tekse yanlış olacaktır.


21

Her çift sayı, ondalık olup olmadığına bakılmaksızın ikiye bölünebilir (ancak varsa ondalık da çift olmalıdır). Böylece %soldaki sayıyı sağdaki sayıya bölen ve kalanı döndüren (modulo) operatörünü kullanabilirsiniz ...

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

1
'Bir ondalık olup olmadığına bakılmaksızın' anlamsızdır. Ondalık bir tabandır. Yani 'kesirli bir kısım içerir' mi?
Marquis of Lorne

4

Ben tavsiye ederim

Java Bulmacaları: Tuzaklar, Tuzaklar ve Köşe Vakaları Kitabı Joshua Bloch ve Neal Gafter

Sayının tek olup olmadığının nasıl kontrol edileceğine dair kısa bir açıklama var. İlk deneme, @AseemYadav'ın denediğine benzer bir şey:

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

ancak kitapta belirtildiği gibi:

kalan işlem sıfırdan farklı bir sonuç döndürdüğünde, sol işlenen ile aynı işarete sahiptir

yani genellikle negatif tek sayıya sahip 1olduğumuzda bunun yerine -1sonucunu elde ederiz i%2. Böylece @Camilo çözümünü kullanabiliriz veya sadece şunları yapabiliriz:

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

ancak genellikle en hızlı çözüm, yukarıda @lucasmo gibi AND operatörünü kullanmaktır:

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

@Düzenle Ayrıca Math.floorMod(int x, int y);, temettüyü negatif olan ancak -1bölen negatifse geri dönebileceğini de belirtmeye değer


2

Pozitif veya negatif sayılar için çalışır

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

Sayının çift mi yoksa tek mi olduğunu kontrol etmek için en az anlamlı bit (en sağdaki) kullanılabilir. Tüm Tek sayılar için, ikili gösterimde en sağdaki bit her zaman 1'dir.

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

2

Aşağıdaki program büyük sayıları işleyebilir (20'den büyük basamak sayısı)

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

    }
}

İşte çıktı:

  122873215981652362153862153872138721637272
  Even

1

Modül işlecini kullanabilirsiniz, ancak bu yavaş olabilir. Daha verimli bir yol, en düşük biti kontrol etmektir çünkü bu, bir sayının çift mi yoksa tek mi olduğunu belirler. Kod şuna benzer:

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

Bunu beğenebilirsin:

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

Bunun nedeni, Java'nın modulo işleminde temettü, sol tarafın işaretine sahip olmasıdır: n. Yani negatifler ve pozitif temettüler için modulo bunların işaretini taşır.

Tabii ki, bitsel işlem daha hızlı ve optimize edilmiştir, basitçe kod satırını iki veya üç kısa sözcükle belgeleyin, bu da bunu okunabilirlik için yapar.


Modulo operatörü değil, kalan operatör olarak adlandırılır .
Marquis of Lorne

1

Bunu if / else koşulunu kullanmadan yapmanın başka bir kolay yolu (hem pozitif hem de negatif sayılar için çalışır):

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

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

Tek no. İçin ifade kalan olarak '1'i döndürür ve

messages.get (1) = 'tek' ve dolayısıyla 'tek' yazdırılıyor

aksi takdirde, ifade "0" sonucuyla geldiğinde "çift" yazdırılır


1
Bu soru JAVA olarak etiketlendi. Python'da bir cevap gönderdin. O kadar da kullanışlı değil.
Mark

Hey @Mark! Buna işaret ettiğiniz için teşekkürler, cevabı düzenledim. Umarım, bu sefer yine de birine yardımcı olabilir.
Aseem Yadav

1
Kolayca örneğin çöktü edilebilir: int n = -3;. @Camilo'nun aşağıda belirtildiği gibi - kalan işlem sıfırdan farklı bir sonuç döndürdüğünde, sol System.out.println(messages.get(-1));java.lang.ArrayIndexOutOfBoundsException
işlenenle

1

Verilen sayının modülü sıfıra eşitse, sayı çift sayıdır. Bunu yapan yöntem aşağıdadır:

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

"" Nin amacı nedir? işareti
Rana Talha Tariq

0

İşte belirli bir sayının çift mi yoksa tek mi olduğunu belirlemek için bir örnek:

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

Aynı şeyi belirlemenin birçok yolu var. Verilen sayının çift veya tek olduğunu bulmak için daha fazla örnek için bu kaynağa bakın .


0

İşte tam örnek: -

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

görüntü açıklamasını buraya girin

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.