2010-03-12 6 views
9

मैं परिणाम प्राप्त कर रहा हूं जब मैं ऑब्जेक्टिव-सी में मॉड्यूलो अंकगणित करता हूं। -1% 3 -1 होने के लिए बाहर आ रहा है, जो सही जवाब नहीं है: मेरी समझ के अनुसार, यह होना चाहिए 2. -2% 3 -2 से बाहर आ रहा है, जो भी सही नहीं है: इसे चाहिए 1.उद्देश्य-सी में मॉड्यूलो ऑपरेटर गलत परिणाम देता है

क्या सही परिणाम प्राप्त करने के लिए% ऑपरेटर के अलावा मुझे एक और विधि का उपयोग करना चाहिए?

+0

उत्सुक अगर इनमें से कोई भी उत्तर पुनः मॉड्यूल था जो आप – kris

+1

के लिए देख रहे थे तो आप Frem (ए, बी) का उपयोग करें - जिस मॉड्यूल की आप उम्मीद कर रहे हैं (जिसे मानक गणित में उपयोग किया जाता है) को कोडिंग में "शेष" कहा जाता है । सी में fmod() और frem() है, आप mod (उर्फ "%") का उपयोग कर रहे हैं, आपको rem का उपयोग करने की आवश्यकता है। गणित में मॉडुलो === कोड में शेष (रिम)। गूंगा, मुझे पता है। –

+0

यह मेरे ध्यान में लाया गया है कि एफआरएम (ए, बी) केवल जीएनयू सी में था और ओब्जे-सी में नहीं ले जाया गया था। समकक्ष यह होगा: 'ए-बी * मंजिल ((फ्लोट) ए/(फ्लोट) बी)' –

उत्तर

7

उद्देश्य-सी सी 99 का एक सुपरसेट है और सी 99परिभाषित करता है जब a नकारात्मक होता है। the Wikipedia entry on the Modulo operation और this StackOverflow question भी देखें।

कुछ (a >= 0) ? (a % b) : ((a % b) + b) (जिसे परीक्षण नहीं किया गया है और शायद अनावश्यक कोष्ठक है) आपको कुछ परिणाम देना चाहिए।

+0

बढ़िया! यह मेरे लिए काम करता था, हालांकि मुझे 2 परिस्थितियों का सामना करना पड़ा जिससे मुझे त्रुटि हुई: (1) -n mod n 0 के बजाय n देता है (2) इसे मैक्रो के रूप में परिभाषित करते समय, कुछ कोष्ठक जहां भ्रमित हो जाते हैं। मैं कर रहा हूं: # परिभाषित मॉड्यूल (ए, बी) (ए> = 0 || - (ए) == (बी))? (ए)% (बी): ((ए)% (बी) + बी) – kahlo

2

एएनएसआई C99 6.5.5 Multiplicative operators-

6.5.5.5: / ऑपरेटर का परिणाम दूसरे से पहले संकार्य के विभाजन से भागफल है; % ऑपरेटर का परिणाम शेष है। दोनों परिचालनों में, यदि दूसरे ऑपरेंड का मान शून्य है, तो व्यवहार अपरिभाषित है।

6.5.5.6: जब पूर्णांक विभाजित होते हैं, तो / ऑपरेटर का परिणाम बीजगणितीय भाग को किसी भी आंशिक भाग को छोड़कर (* 9 0) होता है। यदि quotient a/b प्रतिनिधित्व योग्य है, तो अभिव्यक्ति (a/b)*b + a%ba के बराबर होगी।

* 90: इसे अक्सर "शून्य की ओर छंटनी" कहा जाता है।

मॉड्यूलो व्यवहार का प्रकार जिसे आप सोच रहे हैं उसे "मॉड्यूलर अंकगणितीय" या "संख्या सिद्धांत" शैली मॉड्यूलो/शेष कहा जाता है। मॉड्यूलो ऑपरेटर की मॉड्यूलर अंकगणितीय/संख्या सिद्धांत परिभाषा का उपयोग करके, नकारात्मक परिणाम होने के लिए यह गैर-संवेदी है। यह (स्पष्ट रूप से) मॉड्यूल व्यवहार का शैली परिभाषित नहीं है और सी 99 द्वारा उपयोग किया जाता है। सी 99 तरीके से कुछ भी "गलत" नहीं है, यह वही नहीं है जो आप उम्मीद कर रहे थे। :)

0

एक स्पष्ट समारोह है कि आप सही उत्तर दे देंगे अंत में है, लेकिन पहले, यहाँ अन्य विचारों में से कुछ की एक व्याख्या है कि चर्चा की गई है:

वास्तव में, (a >= 0) ? (a % b) : ((a % b) + b) केवल में परिणाम होगा सही उत्तर अगर ऋणात्मक संख्या, ए, बी के एक से अधिक के भीतर है।

दूसरे शब्दों में: यदि आप खोजना चाहते हैं: -1% 3, तो सुनिश्चित करें, (a >= 0) ? (a % b) : ((a % b)+ b) काम करेगा क्योंकि आपने ((a % b) + b) में अंत में वापस जोड़ा था।

-1 % 3 = -1 और -1 + 3 = 2, जो सही उत्तर है।

हालांकि, अगर आप इसके साथ कोशिश एक = -4 और ख = 3, तो यह काम नहीं करेगा:

-4 % 3 = -4 लेकिन -4 + 3 = -1

हालांकि यह तकनीकी रूप से 2 (मॉड्यूल 3) के बराबर है, मुझे नहीं लगता कि यह वह उत्तर है जिसे आप ढूंढ रहे हैं।आप संभवतः कैनोलिक रूप की अपेक्षा कर रहे हैं: यह है कि उत्तर हमेशा 0 और एन -1 के बीच एक गैर-ऋणात्मक संख्या होना चाहिए।

आप +3 दो बार जोड़ने के लिए इस सवाल का जवाब भी प्राप्त करना होगा:

a - floor((float) a/b)*b 

** सावधान:

-4 + 3 = -1 
-1 + 3 = 2 

यहाँ एक स्पष्ट तरीका यह करने के लिए है! सुनिश्चित करें कि आप वहां (फ्लोट) कास्ट रखें। अन्यथा, यह ए/बी को पूर्णांक के रूप में विभाजित करेगा और आपको नकारात्मक के लिए एक अप्रत्याशित उत्तर मिलेगा। बेशक इसका मतलब है कि आपका परिणाम भी एक फ्लोट होगा। यह 2.000000 की तरह फ्लोट के रूप में लिखा गया एक पूर्णांक होगा, इसलिए आप पूरे उत्तर को पूर्णांक में परिवर्तित करना चाहेंगे।

(int) (a - floor((float) a/b)*b) 
3

स्पेंसर, वहाँ mods (जिस तरह से यह गणित में परिभाषित किया है, प्रोग्रामिंग नहीं) के बारे में सोचने के लिए एक सरल तरीका है। यह वास्तव में नहीं बल्कि सीधा है:

सभी पूर्णांकों लें:

...- 9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 9 ...

अब चलो 3 के गुणकों के बारे में सोचें (यदि आप mod 3 पर विचार कर रहे हैं)। आइए 0 से शुरू करें और 3:

...- 9, -8, -7, -2, -1, , 1 के सकारात्मक गुणक , 2, 3 , 4, 5, 6 , 7, 8, 9 ...

इन सभी नंबरों को जब 3 से विभाजित शून्य शेष है, यानी इन सभी जो शून्य करने के लिए mod।

अब चलिए इस पूरे समूह को एक-एक करके बदल दें।

...- 9, -8, -7, -6, -5, -4, -3, -2, -1, 0, , 2, 3, 4 , 5, 6, 7 , 8, 9 ...

इन सभी नंबरों को जब 3 से विभाजित 1 के एक शेष है, कर रहे हैं यानी इन सभी लोगों को है कि करने के लिए 1.

आइए अब बदलाव आधुनिक हैं इस पूरे समूह को एक बार फिर से।

...- 9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2 , 3, 4, 5 , 6, 7, 8 , 9 ...

इन सभी नंबरों को जब 3 से विभाजित 2 के एक शेष है, कर रहे हैं यानी इन सभी लोगों को है कि करने के लिए 2.

आप करेंगे आधुनिक हैं ध्यान दें कि इन मामलों में से प्रत्येक में, चयनित संख्या 3 से बाहर हो जाती है। हम हमेशा हर तीसरे नंबर लेते हैं क्योंकि हम मॉड्यूल 3 पर विचार कर रहे हैं। (यदि हम मॉड 5 कर रहे थे, तो हम हर पांचवें नंबर लेते थे)।

तो, आप इस पैटर्न को नकारात्मक संख्याओं में पीछे ले जा सकते हैं। बस 3 की दूरी रखें।आप इन तीन अनुरूपता वर्गों मिल जाएगा (तुल्यता कक्षाओं, के रूप में वे गणित में कहा जाता है की एक विशेष प्रकार):

... -9, -8, -7, -6, -5, -4, -3, -2, -1, , 1, 2, 3 , 4, 5, 6 , 7, 8, 9 ...

...- 9, -8, -7, -6, -5, -4, -3, -2, -1, 0, , 2, 3, 4 , 5, 6, 7 , 8, 9 ...

...- 9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, , 3, 4, , 6, 7, , 9 ...

इन समकक्ष संख्याओं का मानक गणितीय प्रतिनिधित्व कक्षा के अवशेष का उपयोग करना है, जिसका अर्थ केवल सबसे छोटा गैर-ऋणात्मक संख्या लेना है।

तो आम तौर पर, जब मैं mods के बारे में सोच रहा हूँ और मैं एक नकारात्मक संख्या के साथ काम कर रहा हूँ, मैं सिर्फ क्रमिक सापेक्ष संख्या फिर से और फिर जोड़ने की जब तक मैं पहले 0 या सकारात्मक नंबर मिल लगता है:

यदि हम मॉड 3 कर रहे हैं, तो -1 के साथ, बस 3 बार जोड़ें: -1 + 3 = 2. -4 के साथ, 3 बार दो बार जोड़ें क्योंकि एक बार पर्याप्त नहीं है। अगर हम एक बार +3 जोड़ते हैं, तो हमें -4 + 3 = -1 मिलता है, जो अभी भी नकारात्मक है। तो हम फिर से +3 जोड़ देंगे: -1 + 3 = 2.

चलो एक बड़ी नकारात्मक संख्या, जैसे -23 की कोशिश करें। यदि आप +3 जोड़ते रहते हैं, तो आप पाएंगे:

-23, -20, -17, -14, -11, -8, -5, -2, 1. हमें सकारात्मक संख्या मिली, इसलिए हम रूक जा। अवशेष 1 है, और यह वह रूप है जो गणितज्ञ आमतौर पर उपयोग करते हैं।

1

मुझे एक ही समस्या थी, लेकिन मैंने इसे काम किया! तुम सब अगर संख्या सकारात्मक या नकारात्मक है और अगर यह नकारात्मक है, तो आप एक और नंबर जोड़ना होगा जाँच करने की जरूरत है:

//neg 
// -6 % 7 = 1 
int testCount = (4 - 10); 
if (testCount < 0) { 
    int moduloInt = (testCount % 7) + 7; // add 7 
    NSLog(@"\ntest modulo: %d",moduloInt); 
} 
else{ 
    int moduloInt = testCount % 7; 
    NSLog(@"\ntest modulo: %d",moduloInt); 
} 

// pos 
// 1 % 7 = 1 
int testCount = (6 - 5); 
if (testCount < 0) { 
    int moduloInt = (testCount % 7) + 7; // add 7 
    NSLog(@"\ntest modulo: %d",moduloInt); 
} 
else{ 
    int moduloInt = testCount % 7; 
    NSLog(@"\ntest modulo: %d",moduloInt); 
} 

आशा है कि मदद करता है! ए