दिलचस्प पोस्ट
नए सी / सी ++ मानकों के लिए विजुअल स्टूडियो समर्थन? Mongoose ने अपने संदर्भित मॉडल के क्षेत्र के आधार पर मॉडल पर क्वेरी को नेस्टेड किया है क्या अपलोड करने से पहले छवि के आयामों को जांचना संभव है? एएसपी.नेट एमवीसी में क्रिस्टल रिपोर्ट्स कैसे Laravel एपीआई का उपयोग कर AngularJS फॉर्म में csrf_token () भेजना है? दो (या अधिक) वैक्टर से सभी तत्वों का अद्वितीय संयोजन जब / कैसे लिनक्स लोड पते पुस्तकालयों में पता स्थान में है? कैसे सीपीयू कोर की संख्या के माध्यम से पता .net / सी #? RelativeLayout wrap_content के लिए पूर्ण स्क्रीन ले रहा है लिनक्स ओओएम किलर द्वारा किस प्रक्रिया को मार डाला गया? jQuery सीएसएस – <style> -tag में लिखें एंड्रॉइड एमुलेटर और वर्चुअलबॉक्स एक ही समय में नहीं चल सकते अतुल्यकालिक कार्य थ्रॉटलिंग बैकस्लैश युक्त पथ स्ट्रिंग के लिए अपरिचित एस्केप अनुक्रम ImportError: DLL लोड विफल:% 1 वैध Win32 अनुप्रयोग नहीं है

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

मैं एक सरणी स्थिति प्राप्त करने के लिए एक पूर्णांक को संशोधित करने की कोशिश कर रहा हूं ताकि यह लूप दौर हो। 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 

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

Solutions Collecting From Web of "ऋणात्मक संख्या का मोड मेरे दिमाग को पिघल रहा है"

मैं हमेशा अपने खुद के 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 से अधिक नकारात्मक नहीं होगा।