मैं C # में पूर्णांक के लिए डिवाइड और मॉडुलो की गणना कैसे कर सकता हूं?


85

मैं C # में पूर्णांक संख्याओं के लिए विभाजन और मोडुलो की गणना कैसे कर सकता हूं?


15
यह बहुत बुनियादी हो सकता है, लेकिन यह एक वास्तविक सवाल है ...

2
एक संबंधित पोस्ट और ब्लॉग को जरूर पढ़ना चाहिए कि %ऑपरेटर C # में मापांक ऑपरेटर क्यों नहीं है।
RBT

जवाबों:


123

इस तरह के प्रश्न पूछने से पहले, कृपया MSDN प्रलेखन की जाँच करें ।

जब आप दो पूर्णांकों को विभाजित करते हैं, तो परिणाम हमेशा पूर्णांक होता है। उदाहरण के लिए, 7/3 का परिणाम है 2. शेष 7/3 का निर्धारण करने के लिए, शेष ऑपरेटर ( % ) का उपयोग करें ।

int a = 5;
int b = 3;

int div = a / b; //quotient is 1
int mod = a % b; //remainder is 2

9
% शेष राशि लौटाता है, मापांक नहीं (जैसा कि आप बताते हैं)। वे एक ही बात करते हैं, और असामान्य मामलों (जैसे नकारात्मक सूचकांक) से निपटने के दौरान समस्याएं पैदा कर सकते हैं। हालांकि, इसका उपयोग मापांक ऑपरेटर की तरह किया जा सकता है, जब बस की तलाश है, उदाहरण के लिए, एक कमजोर सकारात्मक सूचकांक के हर 10 वें पुनरावृत्ति। शायद आप समझा सकते हैं कि वास्तविक मापांक की गणना कैसे करें?
Cor_Blimey

1
सच है, मैं इस तरह की पोस्ट पढ़ता हूं, और मुझे अपने आवेदन में समस्याएं :)
सर्वनाश

1
... वास्तव में घोषित करने की बात क्या है aऔर bयदि आप उनका उपयोग नहीं करने जा रहे हैं? : डी
लेविथानबर्गर

1
शायद उपयोगकर्ता DivRem फ़ंक्शन के लिए (मेरे जैसे) खोज रहा था, इसलिए यह प्रश्न उतना तुच्छ नहीं हो सकता है जितना पहली नज़र में लगता है। धन्यवाद @danodonovan
टैनक्रेडी

1
यह उत्तर उतना सरल नहीं है जितना कि यह उत्तर दावा करता है, जैसा कि अन्य लोगों ने भी बताया है, और यह कठिन-से-डीबग गलतियों को जन्म दे सकता है। Https://stackoverflow.com/questions/10065080/mod-explanation
SansWit

88

वहाँ भी Math.DivRem

quotient = Math.DivRem(dividend, divisor, out remainder);

2
यह मेरी राय में सही उत्तर होना चाहिए, क्योंकि यह एक फ़ंक्शन में भागफल और शेष प्रदान करता है। मुझे यकीन नहीं है कि कौन सा दृष्टिकोण बेहतर प्रदर्शन करता है ("ए / बी" का उपयोग करने के लिए भागफल पाने के लिए और फिर शेष या गणित के लिए "डी ए"% बी), लेकिन यह दृष्टिकोण निश्चित रूप से पढ़ने के लिए बहुत अच्छा है (मेरे मामले में मुझे चाहिए) दोनों को जानने के लिए और शेष) - धन्यवाद!
इगोर

2
@ आईजीआर धन्यवाद, जब मूल प्रश्न का उत्तर दिया गया तो यह कार्य मौजूद नहीं था! हालाँकि, फ़ंक्शन के अस्तित्व के रूप में प्रलेखन की जाँच के बारे में cii की टिप्पणी थोड़ी मूर्खतापूर्ण लगती है .... :)
danodonovan

5
बस भ्रम से बचने के लिए, Math.DivRemएक ऑपरेशन में डिव और मॉड की गणना नहीं करता है। यह सिर्फ एक सहायक कार्य है और इसका स्रोत कोड बिल्कुल: है public static int DivRem(int a, int b, out int result) { result = a%b; return a/b; }
नाइटलाइफ

9
@NightElfik कार्यान्वयन भविष्य में बदल सकता है, और रनटाइम के लिए divrem
असहमति

6
@kbolino कि एक महान भविष्यवाणी है, के बाद से यह है बदल , कम से कम नेट कोर में, विभाजित और घटाना। और एक एकल x86 div निर्देश का उपयोग करने के लिए RyuJIT में आगे के अनुकूलन की योजना बनाई गई है, हालांकि व्यक्तिगत रूप से उपयोग किए जाने पर JIT परिवर्तनों को भी ऑपरेटरों %और /ऑपरेटरों का पता लगाना चाहिए ।
बॉब

15

मजेदार तथ्य!

'मापांक' ऑपरेशन को इस प्रकार परिभाषित किया गया है:

a % n ==> a - (a/n) * n

संदर्भ: मॉड्यूलर अंकगणित

तो आप कर सकते थे अपना स्वयं का रोल हैं, हालांकि यह% ऑपरेटर में निर्मित की तुलना में FAR धीमा होगा:

public static int Mod(int a, int n)
{
    return a - (int)((double)a / n) * n;
}

संपादित करें: वाह, मिसकॉक बल्कि बुरी तरह से यहाँ मूल रूप से, धन्यवाद @joren मुझे पकड़ने के लिए

अब यहाँ मैं इस तथ्य पर भरोसा कर रहा हूं कि C # में डिवीजन + कास्ट-टू-इंट Math.Floor(यानी यह अंश को गिराता है) के बराबर है , लेकिन "सही" कार्यान्वयन इसके बजाय कुछ इस तरह होगा:

public static int Mod(int a, int n)
{
    return a - (int)Math.Floor((double)a / n) * n;
}

वास्तव में, आप निम्न के साथ% और "सच्चे मापांक" के बीच अंतर देख सकते हैं:

var modTest =
    from a in Enumerable.Range(-3, 6)
    from b in Enumerable.Range(-3, 6)
    where b != 0
    let op = (a % b)
    let mod = Mod(a,b)
    let areSame = op == mod
    select new 
    { 
        A = a,
        B = b,
        Operator = op, 
        Mod = mod, 
        Same = areSame
    };
Console.WriteLine("A      B     A%B   Mod(A,B)   Equal?");
Console.WriteLine("-----------------------------------");
foreach (var result in modTest)
{
    Console.WriteLine(
        "{0,-3} | {1,-3} | {2,-5} | {3,-10} | {4,-6}", 
        result.A,
        result.B,
        result.Operator, 
        result.Mod, 
        result.Same);
}

परिणाम:

A      B     A%B   Mod(A,B)   Equal?
-----------------------------------
-3  | -3  | 0     | 0          | True  
-3  | -2  | -1    | -1         | True  
-3  | -1  | 0     | 0          | True  
-3  | 1   | 0     | 0          | True  
-3  | 2   | -1    | 1          | False 
-2  | -3  | -2    | -2         | True  
-2  | -2  | 0     | 0          | True  
-2  | -1  | 0     | 0          | True  
-2  | 1   | 0     | 0          | True  
-2  | 2   | 0     | 0          | True  
-1  | -3  | -1    | -1         | True  
-1  | -2  | -1    | -1         | True  
-1  | -1  | 0     | 0          | True  
-1  | 1   | 0     | 0          | True  
-1  | 2   | -1    | 1          | False 
0   | -3  | 0     | 0          | True  
0   | -2  | 0     | 0          | True  
0   | -1  | 0     | 0          | True  
0   | 1   | 0     | 0          | True  
0   | 2   | 0     | 0          | True  
1   | -3  | 1     | -2         | False 
1   | -2  | 1     | -1         | False 
1   | -1  | 0     | 0          | True  
1   | 1   | 0     | 0          | True  
1   | 2   | 1     | 1          | True  
2   | -3  | 2     | -1         | False 
2   | -2  | 0     | 0          | True  
2   | -1  | 0     | 0          | True  
2   | 1   | 0     | 0          | True  
2   | 2   | 0     | 0          | True  

"अब यहां मैं इस तथ्य पर भरोसा कर रहा हूं कि C # में पूर्णांक विभाजन Math.Floor (यानी, यह अंश को गिराता है) के बराबर है" - लेकिन यह नहीं है। पूर्णांक शून्य की ओर चक्कर काटता है, Math.Floor नकारात्मक अनंत की ओर गोल होता है।
जोरेन

@Joren क्षमा करें, लेकिन नहीं - इसे चलाने का प्रयास करें: Enumerable.Range(0, 10).Select(x => (double)x / 10.0).Select(x => (int)x).ToList().ForEach(x => Console.WriteLine(x));- सभी 0
जेरकीबॉल

2
पहले, मैं पूर्णांक विभाजन के बारे में बात कर रहा हूँ । यदि आप फ्लोटिंग-पॉइंट डिवीजन करते हैं और तब पूर्णांक के लिए कास्ट अप्रासंगिक होता है (भले ही यह समान परिणाम देता है) तब क्या होता है। दूसरा, मुझे यकीन नहीं है कि आप 0 और 9 के बीच पूर्णांक की अपेक्षा करेंगे कि 10 से विभाजित करने और पूर्णांक वाले हिस्से को विभाजित करने के बाद 0 के अलावा और कुछ भी न दें। यदि इसका परिणाम 1 है जो शून्य से दूर या सकारात्मक अनंत की ओर होगा । तीसरा, शून्य की ओर बढ़ने और सकारात्मक संख्याओं के लिए नकारात्मक अनंत की ओर बढ़ने के बीच कोई अंतर नहीं है , इसलिए आप इस मुद्दे को भी संबोधित नहीं कर रहे हैं।
जोरेन

Math.Floor(-10.0 / 3.0)और एक ही बात नहीं-10 / 3 कर रहे हैं ।
जोरेन

@ जेनोरेन, मैं यहां डिस्कनेक्ट देखता हूं - नहीं, मैं पूर्णांक विभाजन नहीं कर रहा हूं, मैं डबल डिवीजन का प्रदर्शन कर रहा हूं, फिर पूर्णांक के परिणाम को कास्टिंग कर रहा हूं - बहुत अलग।
जेरकीबॉल

14

/ऑपरेटर का उपयोग करके विभाजन किया जाता है :

result = a / b;

मोडुलो डिवीजन %ऑपरेटर का उपयोग करके किया जाता है :

result = a % b;

1
+1: आसानी से बाहर निकलने से यह एक बेहतर उत्तर बन जाता है :-) मुझे विश्वास है कि यह System.Numeric.BigInteger के साथ 4.0 में भी काम करता है।

5
% -> जैसा कि Cor_Blimey ने कहा, यह शेष है मापांक नहीं। उदाहरण के लिए: (-5% 3) == -2 [सी #], -5 मॉड 3 = 1 [wolframalpha.com]।
सर्वनाश

2
नोट: मोडुलो मोडुलस के समान नहीं है। मोडुलो शेष है, मापुलस निरपेक्ष मान है।
रयान

-4

उपयोगकर्ता से दो पूर्णांक पढ़ें। फिर शेष और भागफल की गणना / प्रदर्शन करें,

// When the larger integer is divided by the smaller integer
Console.WriteLine("Enter integer 1 please :");
double a5 = double.Parse(Console.ReadLine());
Console.WriteLine("Enter integer 2 please :");
double b5 = double.Parse(Console.ReadLine());

double div = a5 / b5;
Console.WriteLine(div);

double mod = a5 % b5;
Console.WriteLine(mod);

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