दिलचस्प पोस्ट
रूट के सापेक्ष लिंक होने के नाते? Msiexec का उपयोग किए बिना कमांड लाइन से एक MSI फ़ाइल को अनइंस्टॉल करना IPhone आवेदन से बाहर निकलने का सही तरीका है? सी # में एक स्ट्रिंग एन्कोडिंग निर्धारित करें जावा सुरक्षा अपवाद: हस्ताक्षरकर्ता जानकारी मेल नहीं खाती आप एक वीकएचशैप या कमजोर का उपयोग कब करेंगे? एंड्रॉइड डिवाइस को जागृत करें <Div> बनाएँ और गतिशील रूप से <div> जोड़ें फ़ायरफ़ॉक्स या क्रोम में ActiveXObject (IE नहीं!) मैं iPhone 6/6 प्लस लैंडस्केप केवल ऐप के लिए लॉन्च चित्र कैसे बनाऊँ? वैरिएबल का उपयोग करके गतिशील रूप से ऑब्जेक्ट प्रॉपर्टी का उपयोग दूसरा कॉल करने के लिए 2 कॉलम का उपयोग करके Vlookup स्कला में वस्तु और वर्ग के बीच का अंतर लिस्ट बॉक्स आइटम वापसी स्ट्रिंग, जब DataTemplate बटन है सामान्य मानचित्रण गलत तरीके से चले गए

ऋणात्मक संख्या का मोड मेरे दिमाग को पिघल रहा है

मैं एक सरणी स्थिति प्राप्त करने के लिए एक पूर्णांक को संशोधित करने की कोशिश कर रहा हूं ताकि यह लूप दौर हो। i % arrayLength करना सकारात्मक संख्याओं के लिए ठीक काम करता है लेकिन ऋणात्मक संख्याओं के लिए यह सब गलत हो जाता है

  4 % 3 == 1 3 % 3 == 0 2 % 3 == 2 1 % 3 == 1 0 % 3 == 0 -1 % 3 == -1 -2 % 3 == -2 -3 % 3 == 0 -4 % 3 == -1 

इसलिए मुझे इसके कार्यान्वयन की आवश्यकता है

 int GetArrayIndex(int i, int arrayLength) 

ऐसा है कि

 GetArrayIndex( 4, 3) == 1 GetArrayIndex( 3, 3) == 0 GetArrayIndex( 2, 3) == 2 GetArrayIndex( 1, 3) == 1 GetArrayIndex( 0, 3) == 0 GetArrayIndex(-1, 3) == 2 GetArrayIndex(-2, 3) == 1 GetArrayIndex(-3, 3) == 0 GetArrayIndex(-4, 3) == 2 

मैंने यह पहले किया है, लेकिन किसी कारण से आज यह मेरे दिमाग को पिघल रहा है 🙁

वेब के समाधान से एकत्रित समाधान "ऋणात्मक संख्या का मोड मेरे दिमाग को पिघल रहा है"

मैं हमेशा अपने खुद के mod फ़ंक्शन का उपयोग करता हूं

 int mod(int x, int m) { return (x%m + m)%m; } 

बेशक, यदि आप मॉड्यूलस ऑपरेशन के लिए दो कॉल करने के बारे में परेशान हैं, तो आप इसे लिख सकते हैं

 int mod(int x, int m) { int r = x%m; return r<0 ? r+m : r; } 

या उनके संस्करण।

इसका कारण यह है कि "x% m" हमेशा [-एम + 1, एम -1] की सीमा में है। इसलिए यदि यह नकारात्मक है, तो इसके लिए मी को जोड़ने से इसे अपने मूल्य मॉड्यूल मी को बदलने के बिना सकारात्मक श्रेणी में डाल दिया जाएगा।

कृपया ध्यान दें कि सी # और सी ++ का% ऑपरेटर वास्तव में एक मॉड्यूल नहीं है, यह शेष है आपके मामले में, आप चाहते हैं कि मॉड्यूल के लिए सूत्र है:

 float nfmod(float a,float b) { return a - b * floor(a / b); } 

आपको इसे सी # (या सी ++) में पढ़ना होगा, लेकिन इस तरह से आप मॉड्यूल प्राप्त करते हैं और शेष नहीं।

एकल-पंक्ति क्रियान्वयन केवल एक बार % का उपयोग कर रहा है:

 int mod(int k, int n) { return ((k %= n) < 0) ? k+n : k; } 

कुछ समझ जोड़ने

यूक्लिडियन परिभाषा से आधुनिक परिणाम हमेशा सकारात्मक होना चाहिए।

उदाहरण के लिए:

  int n = 5; int x = -3; int mod(int n, int x) { return ((n%x)+x)%x; } 

आउटपुट:

  -1 

बस अपने मापांक (सरली लैंप) को% के नकारात्मक परिणाम में जोड़ें और आप ठीक हो जाएंगे।

श्रीवत्सार का जवाब सभी मामलों के लिए काम नहीं करेगा, भले ही आप "अगर (एम <0) एम = -एम;" जोड़ते हैं, यदि आप नकारात्मक लाभांश / विभाजक के लिए खाते हैं

उदाहरण के लिए, -12 मॉड -10 8 हो, और यह -2 होना चाहिए

निम्नलिखित कार्यान्वयन दोनों सकारात्मक और नकारात्मक लाभांश / विभाजक के लिए काम करेगा और अन्य कार्यान्वयन (अर्थात् जावा, पायथन, रूबी, स्काला, स्कीम, जावास्क्रिप्ट और Google के कैलकुलेटर) के अनुरूप होगा:

 internal static class IntExtensions { internal static int Mod(this int a, int n) { if (n == 0) throw new ArgumentOutOfRangeException("n", "(a mod 0) is undefined."); //puts a in the [-n+1, n-1] range using the remainder operator int remainder = a%n; //if the remainder is less than zero, add n to put it in the [0, n-1] range if n is positive //if the remainder is greater than zero, add n to put it in the [n-1, 0] range if n is negative if ((n > 0 && remainder < 0) || (n < 0 && remainder > 0)) return remainder + n; return remainder; } } 

XUnit का प्रयोग करके टेस्ट सूट:

  [Theory] [PropertyData("GetTestData")] public void Mod_ReturnsCorrectModulo(int dividend, int divisor, int expectedMod) { Assert.Equal(expectedMod, dividend.Mod(divisor)); } [Fact] public void Mod_ThrowsException_IfDivisorIsZero() { Assert.Throws<ArgumentOutOfRangeException>(() => 1.Mod(0)); } public static IEnumerable<object[]> GetTestData { get { yield return new object[] {1, 1, 0}; yield return new object[] {0, 1, 0}; yield return new object[] {2, 10, 2}; yield return new object[] {12, 10, 2}; yield return new object[] {22, 10, 2}; yield return new object[] {-2, 10, 8}; yield return new object[] {-12, 10, 8}; yield return new object[] {-22, 10, 8}; yield return new object[] { 2, -10, -8 }; yield return new object[] { 12, -10, -8 }; yield return new object[] { 22, -10, -8 }; yield return new object[] { -2, -10, -2 }; yield return new object[] { -12, -10, -2 }; yield return new object[] { -22, -10, -2 }; } } 

अधिक प्रदर्शन के लिए जागरूक devs

 uint wrap(int k, int n) ((uint)k)%n 

एक छोटा प्रदर्शन तुलना

 Modulo: 00:00:07.2661827 ((n%x)+x)%x) Cast: 00:00:03.2202334 ((uint)k)%n If: 00:00:13.5378989 ((k %= n) < 0) ? k+n : k 

के रूप में करने के लिए कलाकारों की प्रदर्शन लागत के लिए यहाँ एक नज़र है

मुझे पीटर एन लुईस द्वारा इस धागे पर प्रस्तुत की गई चाल पसंद है: "यदि एन की सीमित सीमा होती है, तो आप उस परिणाम को प्राप्त कर सकते हैं जिसे आप केवल [विभाजक] का एक ज्ञात स्थिरांक जोड़कर प्राप्त कर सकते हैं जो कि अधिक से अधिक है न्यूनतम।"

तो अगर मेरे पास एक मान डी होता है जो डिग्री में है और मैं ले जाना चाहता हूं

 d % 180f 

और मैं समस्याओं से बचने के लिए चाहता हूँ अगर डी नकारात्मक है, फिर इसके बजाय मैं यह बस करता हूं:

 (d + 720f) % 180f 

यह मानता है कि हालांकि डी नकारात्मक हो सकता है, यह ज्ञात है कि यह कभी -720 से अधिक नकारात्मक नहीं होगा।