जाँच करें कि क्या संख्या सम या विषम है


128

मैं यह कैसे निर्धारित करूंगा कि कोई दी गई संख्या सम या विषम है? मैं एक लंबे समय के लिए यह पता लगाना चाहता था और कहीं भी नहीं मिला।

जवाबों:


200

आप मापांक ऑपरेटर का उपयोग कर सकते हैं, लेकिन यह धीमा हो सकता है। यदि यह पूर्णांक है, तो आप कर सकते हैं:

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

ऐसा इसलिए है क्योंकि कम बिट हमेशा एक विषम संख्या पर सेट किया जाएगा।


23
यह अभी भी मुझे आश्चर्यचकित करता है कि लोग केवल संख्या के पहले बिट की जांच करने पर मापांक पसंद करते हैं। जाहिर है अगर पहला बिट सेट है, तो संख्या विषम होनी चाहिए। यह आमतौर पर तेज़ होता है, और यह सिर्फ मेरी राय में भी पढ़ता है। मुझे लगता है कि अन्य लोग इसे मापांक से अधिक पसंद नहीं करते हैं, बाइनरी की समझ में कमी के कारण आता है।
क्रश करें

5
@dtech मुझे लगता है कि आप समयपूर्व अनुकूलन के अर्थ को गलत समझते हैं। यदि आप पहले से जानते हैं कि एक विधि दूसरे की तुलना में अधिक निष्पादित है, तो यह अधिक निष्पादन विधि का उपयोग करने के लिए समय से पहले अनुकूलन नहीं है। यह बुद्धिमान है। उस ने कहा, मेरी टिप्पणी इस बारे में अधिक थी कि कैसे पहले बिट की जाँच करना मापांक का उपयोग करने की तुलना में अधिक तार्किक है जब बस / विषम के लिए भी जाँच हो। समस्या यह है कि कई प्रोग्रामर समझ नहीं पाते हैं कि विधि क्या करती है, और बस ट्यूटोरियल का पालन करें।
क्रश करें

54
@ क्रूस n % 2 == 0शब्दार्थ का अर्थ है Divide by 2 and check if the remainder is 0, जो n & 1 == 0कि अर्थ की तुलना में बहुत स्पष्ट है Zero all the bits but leave the least significant bit unchanged and check if the result is 0। पहले की बेहतर स्पष्टता (शायद गैर-मौजूद) ओवरहेड के लायक है। यही कारण है कि मैं समय से पहले अनुकूलन के साथ था। अगर कुछ धीमा है और आप इसे उस हिस्से में बदलते हैं n % 2, तो n & 1यह निश्चित रूप से उचित है, लेकिन ऐसा पहले से नहीं करना चाहिए। सामान्य रूप से बिट संचालकों के साथ काम करने से पहले प्रोफाइलिंग करना एक बुरा विचार है।
dtech

18
@dtech सबसे पहले, आपकी राय पूरी तरह से व्यक्तिपरक है। दूसरे, आप अभी भी नहीं समझते हैं कि "समय से पहले अनुकूलन" का क्या मतलब है। यह एक सूक्ष्म अनुकूलन है, निश्चित है। यह समयपूर्व अनुकूलन नहीं है। समयपूर्व अनुकूलन मौजूदा कोड को संशोधित करने के बिना "अनुकूलन" के साथ मौजूदा कोड को संशोधित कर रहा है यह देखने के लिए कि यह अक्षम है। हालाँकि, पहले से यह जानना कि कोड लिखना एक तरह से बनाम दूसरा तरीका अधिक कुशल है, और अधिक कुशल कोड का उपयोग करना, समय से पहले का अनुकूलन नहीं है। यह आपकी व्यक्तिपरक राय है जो n % 2 == 0की तुलना में क्लीनर है n & 1 == 0
क्रश करें

15
मैं यहाँ आने वाले लोगों के लिए इशारा करना चाहता हूँ कि मॉडुलो ऑपरेटर का उपयोग करना ठीक है, लेकिन यदि आप इसे विषमता का परीक्षण करने के लिए उपयोग कर रहे हैं, तो n% 2 लिखें! = 0, n% 2 == 1 नहीं, क्योंकि बाद वाला जावा में ऋणात्मक संख्याओं के लिए काम नहीं करता है।
Jxek


30

यदि शेष जब आप 2 से विभाजित करते हैं, तो 0 होता है। %एक शेष पाने के लिए ऑपरेटर है।


12
% ऑपरेटर को मोडुलो कहा जाता है।
एंथनी

4
@ एंथनी: दरअसल, यह "शेष ऑपरेटर" है
रयान स्टीवर्ट

3
गणितीय शब्द मापांक है, और इसमें शेष रहने की तुलना में व्यापक-प्रयोज्यता है। (A % B)खुद को एक अभिव्यक्ति के रूप में इस्तेमाल किया जा सकता है, और जब चीजें मज़ेदार होती हैं।
स्टीफन केंडल

2
@ सैटेफैन: मैं इस बात को विस्तार से नहीं बताऊंगा, लेकिन गणितज्ञों का कहना है कि मॉड्यूलर अंकगणित में मापांक और शेष एक ही चीज नहीं हैं
रयान स्टीवर्ट

2
@StefanKendall जावा भाषा विनिर्देश # 15.17.3 की जाँच करें । Google एक मानक संदर्भ नहीं है।
लोरेन के

24

शेष संचालक,%, आपको एक संख्या से विभाजित करने के बाद शेष देगा।

तो n % 2 == 0यदि n सम है और असत्य है यदि n विषम है तो सत्य होगा।


21

हर एक संख्या दो से विभाज्य है, भले ही वह एक दशमलव हो (लेकिन दशमलव, यदि मौजूद है, तो भी होना चाहिए)। तो आप %(मोडुलो) ऑपरेटर का उपयोग कर सकते हैं , जो बाईं ओर संख्या को दाईं ओर से विभाजित करता है और शेष को वापस करता है ...

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

1
A चाहे वह दशमलव ही क्यों न हो ’व्यर्थ है। दशांश एक मूलांक है। क्या आपका मतलब है 'एक भिन्नात्मक भाग शामिल है'?
लोरेन का

4

मैं सलाह दूँगा

जावा पूज़लर्स: ट्रैप, पॉटैल्स, और कॉर्नर केस बुक जोशुआ बलोच और नील गेयर द्वारा

संक्षिप्त विवरण है कि संख्या विषम है या नहीं, इसकी जांच कैसे करें। पहली कोशिश कुछ वैसी ही है जैसी @AseemYadav ने कोशिश की:

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

लेकिन जैसा कि किताब में बताया गया है:

जब शेष ऑपरेशन नॉनजरो परिणाम देता है, तो उसके बाएं ऑपरेंड के समान चिन्ह होता है

इसलिए आम तौर पर जब हमारे पास ऋणात्मक विषम संख्या होती है, तो इसके बजाय 1हमें -1इसका परिणाम मिलेगा i%2। तो हम @Camilo समाधान या बस का उपयोग कर सकते हैं:

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

लेकिन आम तौर पर सबसे तेजी से समाधान का उपयोग कर रहा है और ऑपरेटर की तरह @lucasmo ऊपर लिखते हैं:

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

@ एडिट यह उस बिंदु के भी लायक है Math.floorMod(int x, int y);जो नकारात्मक के साथ लाभांश से अच्छा व्यवहार करता है, लेकिन -1यदि विभाजक नकारात्मक है तो भी वापस आ सकता है


2

सकारात्मक या नकारात्मक संख्याओं के लिए काम करता है

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

कम से कम महत्वपूर्ण बिट (सबसे दाएं) का उपयोग यह जांचने के लिए किया जा सकता है कि संख्या सम या विषम है। सभी विषम संख्याओं के लिए, द्विआधारी प्रतिनिधित्व में सबसे दाहिना बिट हमेशा 1 होता है।

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

2

यह निम्नलिखित कार्यक्रम बड़ी संख्या (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");

    }
}

यहाँ उत्पादन है ::

  122873215981652362153862153872138721637272
  Even

1

आप मापांक ऑपरेटर का उपयोग कर सकते हैं, लेकिन यह धीमा हो सकता है। एक अधिक कुशल तरीका सबसे कम बिट की जांच करना होगा क्योंकि यह निर्धारित करता है कि कोई संख्या सम या विषम है। कोड कुछ इस तरह दिखेगा:

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

आप इस तरह कर सकते हैं:

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

ऐसा इसलिए है क्योंकि जावा के मॉडुलो ऑपरेशन में लाभांश का चिह्न, बाईं ओर: n है। तो नकारात्मक और सकारात्मक लाभांश के लिए, modulo का संकेत है।

बेशक, बिटवाइज़ ऑपरेशन तेज और अनुकूलित है, बस दो या तीन छोटे शब्दों के साथ कोड की रेखा का दस्तावेजीकरण करें, जो इसे पठनीयता के लिए करता है।



1

एक और आसान तरीका है अगर इसका उपयोग बिना / अन्य शर्त (सकारात्मक और नकारात्मक संख्या दोनों के लिए काम करता है):

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

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

एक विषम संख्या के लिए, अभिव्यक्ति '1' को शेष के रूप में लौटा देगी

messages.get (1) = 'विषम' और इसलिए 'विषम' प्रिंट करना

जब परिणाम '0' के साथ आता है, तब 'भी' मुद्रित होता है


1
इस सवाल को JAVA के रूप में टैग किया गया था। आपने पायथन में एक उत्तर पोस्ट किया। वास्तव में उपयोगी नहीं है।
मार्क

हे @ मर्क! यह इंगित करने के लिए धन्यवाद, उत्तर को संपादित किया। आशा है, यह अभी भी इस समय किसी की मदद कर सकता है।
असीम यादव

1
इसे आसानी से दुर्घटनाग्रस्त किया जा सकता है int n = -3;। जैसा कि @Camilo ने नीचे उल्लेख किया है - जब शेष ऑपरेशन एक नॉनज़ेरो परिणाम वापस करता है, तो उसके बाएं ऑपरेंड के समान चिन्ह होता है इसलिए हमारे पास System.out.println(messages.get(-1));जो जेलेली होता है वह हमें देता हैjava.lang.ArrayIndexOutOfBoundsException
Michu93

1

यदि दी गई संख्या का मापांक शून्य के बराबर है, तो संख्या और भी विषम संख्या है। नीचे वह विधि है जो ऐसा करती है:

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

'का उद्देश्य क्या है?' संकेत
राणा तल्हा तारिक

0

यह निर्धारित करने के लिए एक उदाहरण है कि क्या दी गई संख्या सम या विषम है,

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

वैसे, इसे निर्धारित करने के कई तरीके हैं। दिए गए नंबर को खोजने के लिए इस संसाधन को अधिक उदाहरणों के लिए देखें या सम विषम है।


0

यहाँ पूरा उदाहरण है: -

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

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.