2016-03-17 10 views
5

कुछ BigIntegerb द्वारा विभाज्यता के लिए BigIntegera की जांच करते समय, मैं या तो a.mod(b).equals(BigInteger.ZERO) या a.remainder(b).equals(BigInteger.ZERO) लिख सकता हूं।क्या मुझे विभाज्यता के लिए BigInteger की जांच करते समय mod या शेष का उपयोग करना चाहिए?

दो अभिव्यक्तियों में से कौन सा अधिक कुशल है?

संपादित करें: कई लोगों ने सही ढंग से बताया है कि mod नकारात्मक मॉड्यूलस स्वीकार नहीं करता है। कृपया मान लें कि b आपके उत्तर में सकारात्मक है।

+1

अगर आप इसे देखना चाहते हैं तो 'शेष' का उपयोग करें, यह nonzero है। 'mod' शीर्ष पर थोड़ा अतिरिक्त गणना के साथ बस' शेष 'करता है। – khelwood

+2

एक कार्यान्वयन विस्तार - ओपनजेडीके के हुड के तहत 'mod()' कॉल 'शेष()' के कार्यान्वयन। –

उत्तर

1

ये अलग-अलग ऑपरेशन हैं। आप JavaDoc से देख सकते हैं कि mod() शून्य या नकारात्मक तर्कों के साथ काम नहीं कर रहा है। आप इस आलेख को सहायक पा सकते हैं: http://www.sitecrafting.com/blog/modulus-remainder/

0

b नकारात्मक होने पर वे अलग-अलग व्यवहार करते हैं। आप जिस भी ऑपरेशन का उपयोग करना चाहते हैं उसका प्रयोग करें।

3

javadocs को देखते हुए ..

मॉड (BigInteger मीटर) के लिए:

रिटर्न एक BigInteger जिसका मान (this mod m)। यह विधि शेष से भिन्न है जिसमें यह हमेशा गैर-नकारात्मक BigInteger देता है।

+0

यह प्रश्न का उत्तर कैसे देता है कि दोनों परिचालनों में से कौन सा अधिक कुशल है? – sjakobi

+0

यह भी ध्यान रखें कि मुझे कोई परवाह नहीं है कि परिणाम सकारात्मक या नकारात्मक है - मैं सिर्फ यह जानना चाहता हूं कि यह '0' है या नहीं। – sjakobi

5

उन तरीकों के बीच अंतर जवाडोक में दस्तावेज किया गया है। mod(m) से:

इस विधि अलग है कि में remainder से यह हमेशा एक गैर नकारात्मक BigInteger देता है।

इसके अलावा, इस विधि फेंकता एक ArithmeticException दिया गया आर्ग्यूमेंट, नकारात्मक है अगर जो, अपने संपादित के अनुसार, अपने मामला नहीं है। इस प्रकार, विभाजन के लिए परीक्षण करने के लिए, mod और remainder के बीच कोई अंतर नहीं होगा: जब उनमें से एक 0 है तो दूसरा भी 0 होगा। आप remainder का उपयोग कर सकते हैं क्योंकि mod एक और गणना कर सकता है जिसकी आपको आवश्यकता नहीं है।


कार्रवाई में अंतर देखने के लिए, पर विचार करें:

public static void main(String[] args) { 
    BigInteger a = BigInteger.valueOf(-2); 
    BigInteger b = BigInteger.valueOf(3); 
    System.out.println(a.remainder(b)); // prints -2 
    System.out.println(a.mod(b)); // prints 1 == -2 (i.e. the remainder) + 3 
} 

यह वास्तव में आदिम inta और b के लिए एक ही अंतर है और गणना के a % b (जो remainder तरह बर्ताव करता है) और Math.floorMod(a, b) (जो mod की तरह व्यवहार करता है)।

+0

यह इंगित करने के लिए धन्यवाद कि 'mod' moduli' <= 0' स्वीकार नहीं करेगा! – sjakobi

संबंधित मुद्दे

 संबंधित मुद्दे