2010-12-05 5 views
15

तो निकटतम वापस लौटने के लिए फ़ंक्शन कैसे बनाएं, 9 9 + 1 के नजदीक के करीब, 2 int से विभाजित होने पर कोई शेष नहीं छोड़ा जाए?दिए गए int के लिए निकटतम संख्या भी कैसे खोजें? (11 रिटर्न दिया गया 12)

+10

है यह समस्या नहीं है विशिष्ट रूप से निर्दिष्ट। 10 11 के करीब 11 है। आप कौन सा चाहते है?और नकारात्मक संख्याओं के बारे में क्या? और इनपुट अभिन्न या फ़्लोटिंग बिंदु है? –

+0

@ डेविड: इनपुट स्पष्ट रूप से अभिन्न है, लेकिन आपकी बाकी की टिप्पणी के लिए +1 – Cameron

+0

मुझे विश्वास नहीं है कि ऐसे सभी प्रश्नों के उत्तर दिए गए हैं जिनके पास कोई जवाब नहीं है! –

उत्तर

14

"निकटतम" एक पूर्णांक दिया गया जब अस्पष्ट है। लो, कहो, 9: 8 और 10 दोनों भी हैं, और इसके बराबर हैं। आप हमेशा ऊपर जाना चाहते हैं, तो कुछ की तरह ...

int nearestEvenInt(int to) 
{ 
    return (to % 2 == 0) ? to : (to + 1); 
} 
+0

त्रुटि C2143 होती है ... – Rella

+15

" त्रुटि C2143 होती है ... "... * वह * चालू होना चाहिए एक टी शर्ट। –

+0

इस कोड को लिखने से पहले, आपको यह कहना चाहिए: "मुझे विश्वास है कि मेरे कंपाइलर का अनुकूलक विभाजन और शाखाकरण को हटा देगा" – Abyx

11

number % 2 == 0?number:number+1

एक और तरीका है (number>>1)<<1 है, लेकिन मैं नकारात्मक/छोटे/बड़े endians के बारे में यकीन नहीं है।

+0

'(संख्या >> 1) << 1' में ऋणात्मक मूल्यों के लिए यूबी है। ('>> 'केवल कार्यान्वयन-परिभाषित है, लेकिन' << 'अपरिभाषित है; यह एक हस्ताक्षरित अंकगणित ओवरफ़्लो है) –

39

निकटतम पूर्णांक पर पूर्णांक के लिए:

number+=(number & 1) 
+1

बिट-वार मजे के लिए होरे! – GWW

+7

चतुरता के लिए +1, पठनीयता के लिए -1 ;-) – Cameron

+6

+1 यह जांचने के लिए मॉड्यूल का उपयोग न करने के लिए +1 है कि कोई संख्या भी है या नहीं। – GolezTrol

31

दौर ऊपर और नीचे भी

x & ~1 

दौर के लिए

भी
(x + 1) & ~1 
+3

(नोट: यहां दिए गए अधिकांश उत्तरों के विपरीत, यह ऊपर की ओर गोल करता है) –

+0

@Michael Mrozek आपके नोट – Abyx

+0

के लिए धन्यवाद, स्पष्ट, कुशल, संक्षिप्त और संपूर्ण। यह निश्चित रूप से सबसे अच्छा जवाब है क्योंकि ओपी ने ऊपर या नीचे निर्दिष्ट नहीं किया था। – Tim

8

तरह से मैं सामान्य रूप से पसंद करेंगे (number+1) & ~1 है, लेकिन हर कोई मुहावरे को पहचानता नहीं है, इसलिए आपको अपने ऑडी पर विचार करना पड़ सकता है खिलाडि़यों।

विशेष रूप से, यदि इसे नकारात्मक पूर्णांक के लिए काम करना है तो सी और सी ++ के गैर-दो-पूरक कार्यान्वयन मुहावरे को नहीं पहचानते हैं (यह ऋणात्मक चिह्न + परिमाण संख्याओं के बजाय विषम नकारात्मक संख्याओं को नीचे ले जाएगा , और ऋणात्मक संख्याओं को भी 'पूरक' पर विषमता से बदल दें), इसलिए यह उस मामले में पूरी तरह से पोर्टेबल नहीं है जहां नकारात्मक इनपुट की अनुमति है।

पोर्टेबल उत्तर (number % 2 == 0) ? number : number+1; है, और संकलक को अनुकूलन के बारे में चिंता करने दें।

यह भी ध्यान रखें कि आपने यह परिभाषित नहीं किया है कि परिणाम INT_MAX के लिए क्या होना चाहिए, जो विषम है लेकिन जिसके लिए int मान भी बड़ा नहीं है।

number += (int)((unsigned)number & 1) 

unsigned के मामले सुनिश्चित करता है कि बिटवाइज़-और उम्मीद के रूप में परिभाषित किया जाता है, और कलाकारों:

+0

एक और "पोर्टेबल" संभावना 'संख्या + (संख्या% 2)' है, जो सी 99 में सकारात्मक अनंतता और नकारात्मक अनंतता की ओर सकारात्मक होगा। – caf

+0

यदि आप 0 से दूर भागना चाहते हैं, तो कैफ का जवाब सबसे अच्छा है। लेकिन अगर आप गोल करना चाहते हैं, तो आपको '&' या कुछ बुरा सशर्त उपयोग करने की आवश्यकता होगी। –

3

के बाद से जवाब यहां के सबसे या तो nonportable या अतिरिक्त सशर्त, कर रहे हैं, यहां तेजी से और पोर्टेबल जवाब है वापस करने के लिए int (जो अच्छी तरह से परिभाषित किया गया है, क्योंकि दोनों बिटवाइज़ और आपरेशन, शून्य या एक, int में फिट की संभावित मान) numberunsigned के लिए प्रोत्साहित किया जा रहा से रोकता है, जो तब कार्यान्वयन से परिभाषित व्यवहार में परिणाम होगा जब यह int वापस करने के लिए बदला न गया हो परिणाम number पर असाइन करने के लिए।

1

मैं ओपी पूर्णांक के लिए कहा है, लेकिन यहाँ तैरता के लिए एक ही जवाब भी है:

number = Math.round(number * 0.5f) * 2; //Closest (up for middle) 
number = Math.ceil(number * 0.5f) * 2; //Always Up 
number = Math.floor(number * 0.5f) * 2; //Always Down 
2

पार्टी के लिए देर से एक छोटी सी, लेकिन यह एक स्वच्छ समाधान

n += (n % 2); 
संबंधित मुद्दे