यह सभी नकारात्मक संख्याओं के लिए सही है।
f (n) = abs (n)
चूँकि वहाँ एक से अधिक ऋणात्मक संख्याएँ हैं, क्योंकि टॉक्सो पूरक पूर्णांकों के लिए धनात्मक संख्याएँ हैं, समाधान की f(n) = abs(n)तुलना में एक और मामले के लिए मान्य f(n) = n > 0 ? -n : nहै जो उसी के समान है f(n) = -abs(n)। आपको एक मिला ...: डी
अपडेट करें
नहीं, यह एक मामले के लिए मान्य नहीं है, क्योंकि मुझे सिर्फ लिटबॅट की टिप्पणी से मान्यता प्राप्त है ... abs(Int.Min)बस अतिप्रवाह होगा ...
मैंने मॉड 2 की जानकारी का उपयोग करने के बारे में सोचा, भी, लेकिन निष्कर्ष निकाला, यह काम नहीं करता ... जल्दी। यदि सही किया जाता है, तो यह सभी नंबरों के लिए काम करेगा सिवाय इसके Int.Minक्योंकि यह अतिप्रवाह करेगा।
अपडेट करें
मैं इसके साथ थोड़ी देर के लिए खेला, एक अच्छा सा हेरफेर चाल की तलाश में, लेकिन मुझे एक अच्छा एक-लाइनर नहीं मिला, जबकि मॉड 2 समाधान एक में फिट बैठता है।
f (n) = 2n (abs (n)% 2) - n + sgn (n)
C # में, यह निम्नलिखित बन जाता है:
public static Int32 f(Int32 n)
{
return 2 * n * (Math.Abs(n) % 2) - n + Math.Sign(n);
}
सभी मूल्यों के लिए इसे काम करने के लिए, आपको एक ब्लॉक में गणना को शामिल Math.Abs()करना होगा (n > 0) ? +n : -nऔर शामिल करना होगा unchecked। तब आप Int.Minखुद भी मैप हो जाते हैं जैसे कि अनियंत्रित नकार करता है।
अपडेट करें
एक अन्य उत्तर से प्रेरित होकर मैं यह बताने जा रहा हूं कि फ़ंक्शन कैसे कार्य करता है और इस तरह के फ़ंक्शन का निर्माण कैसे किया जाता है।
शुरू में ही शुरू कर देता है। फ़ंक्शन fको बार-बार दिए गए मान पर लागू किया जाता है, जो nमानों के अनुक्रम को दर्शाते हैं।
n => f (n) => f (f (n)) => f (f (f (n))) => f (f (f (n)))) => ...
प्रश्न मांग करता है f(f(n)) = -n, कि fतर्क को नकारने के दो क्रमिक अनुप्रयोग हैं । आगे के दो f- चार के कुल आवेदन - तर्क को फिर से उपज nफिर से नकारना ।
n => f (n) => -n => f (f (f (n))) => n => f (n) => ...
अब लंबाई चार का एक स्पष्ट चक्र है। स्थानापन्न x = f(n)और यह देखते हुए कि प्राप्त समीकरण f(f(f(n))) = f(f(x)) = -xरखती है, निम्नलिखित अर्जित करता है।
n => x => -n => -x => n => ...
तो हम दो संख्याओं के साथ लंबाई चार का एक चक्र प्राप्त करते हैं और दो संख्याओं को नकार दिया जाता है। यदि आप चक्र को एक आयत के रूप में कल्पना करते हैं, तो नकारात्मक मूल्य विपरीत कोनों पर स्थित हैं।
इस तरह के एक चक्र के निर्माण के कई समाधानों में से एक n से शुरू होने वाला है।
n => एक को नकारा और घटाया
-n - 1 = - (n + 1) => एक जोड़ें
-n => नकारात्मक और एक जोड़ें
n + 1 => एक घटाओ
n
एक ठोस उदाहरण ऐसे चक्र का है +1 => -2 => -1 => +2 => +1। हम लगभग कर चुके हैं। यह देखते हुए कि निर्मित चक्र में एक विषम धनात्मक संख्या होती है, इसका उत्तराधिकारी भी और दोनों संख्याएँ नकारात्मक होती हैं, हम पूर्णांकों को आसानी से कई ऐसे चक्रों में विभाजित कर सकते हैं ( 2^32जो कि चार में से एक है) और एक ऐसा फ़ंक्शन मिला है जो स्थितियों को संतुष्ट करता है।
लेकिन हमें शून्य की समस्या है। चक्र में सम्मिलित होना चाहिए 0 => x => 0क्योंकि शून्य अपने आप में नकारात्मक है। और क्योंकि चक्र पहले से ही 0 => xयह बताता है 0 => x => 0 => x। यह केवल लंबाई दो का एक चक्र है और xदो अनुप्रयोगों के बाद खुद में बदल जाता है, में नहीं -x। सौभाग्य से एक मामला है जो समस्या को हल करता है। यदि Xशून्य शून्य के बराबर होता है, तो हम केवल शून्य वाले लंबाई का एक चक्र प्राप्त करते हैं और हमने उस समस्या को हल कर दिया है कि शून्य एक निश्चित बिंदु है f।
किया हुआ? लगभग। हमारे पास 2^32संख्याएँ हैं, शून्य एक निश्चित बिंदु है जो 2^32 - 1संख्याओं को छोड़ता है , और हमें उस संख्या को चार संख्याओं के चक्रों में विभाजित करना चाहिए। बुरा जो 2^32 - 1चार में से एक नहीं है - लंबाई चार के किसी भी चक्र में नहीं तीन संख्याएँ रहेंगी।
मैं समाधान 3 बिट पर हस्ताक्षर किए से लेकर itegers के छोटे सेट का उपयोग के शेष भाग की व्याख्या करेगा -4करने के लिए +3। हम शून्य के साथ किया जाता है। हमारा एक पूरा चक्र है +1 => -2 => -1 => +2 => +1। अब हम शुरू होने वाले चक्र का निर्माण करते हैं +3।
+3 => -4 => -3 => +4 => +3
समस्या यह है कि +43 बिट पूर्णांक के रूप में प्रतिनिधित्व योग्य नहीं है। हम इसे +4नकार -3कर प्राप्त करेंगे +3- जो अभी भी एक वैध 3 बिट पूर्णांक है - लेकिन फिर एक +3(बाइनरी 011) को जोड़ने से बाइनरी 100मिलती है। अहस्ताक्षरित पूर्णांक के रूप में व्याख्या की गई है, +4लेकिन हमें इसे हस्ताक्षरित पूर्णांक के रूप में व्याख्या करना होगा -4। तो वास्तव -4में इस उदाहरण के लिए या Int.MinValueसामान्य मामले में पूर्णांक अंकगणितीय निषेध का दूसरा निश्चित बिंदु है - 0 और Int.MinValueउन्हें मैप किया जाता है। तो चक्र वास्तव में इस प्रकार है।
+3 => -4 => -3 => -4 => -3
यह लंबाई दो का एक चक्र है और इसके अलावा +3चक्र के माध्यम से प्रवेश करता है -4। परिणाम -4में सही ढंग से दो फ़ंक्शन अनुप्रयोगों के बाद खुद को मैप किया जाता है, दो फ़ंक्शन अनुप्रयोगों के बाद +3सही ढंग से मैप किया जाता है -3, लेकिन -3दो फ़ंक्शन अनुप्रयोगों के बाद गलती से खुद को मैप किया जाता है।
इसलिए हमने एक फ़ंक्शन का निर्माण किया जो सभी पूर्णांकों के लिए काम करता है लेकिन एक। क्या हम बेहतर कर सकते हैं? हम नहीं कर सकते। क्यों? हमें लंबाई चार के चक्रों का निर्माण करना होगा और चार पूर्णांक तक पूरे पूर्णांक रेंज को कवर करने में सक्षम हैं। शेष मान दो निश्चित बिंदु हैं 0और Int.MinValueउन्हें स्वयं और दो मनमाने ढंग से पूर्णांक में मैप किया जाना चाहिए xऔर -xदो फ़ंक्शन अनुप्रयोगों द्वारा एक दूसरे के लिए मैप किया जाना चाहिए।
इसके विपरीत नक्शा बनाने के xलिए -xउन्हें चार चक्र बनाने होंगे और उन्हें उस चक्र के विपरीत कोनों पर स्थित होना चाहिए। परिणाम में 0और Int.MinValueविपरीत कोनों पर भी होना चाहिए। यह सही ढंग से नक्शा करेगा xऔर -xदो निश्चित बिंदुओं 0और Int.MinValueदो फ़ंक्शन अनुप्रयोगों के बाद स्वैप करेगा और दो असफल इनपुट के साथ हमें छोड़ देगा। इसलिए ऐसा फ़ंक्शन बनाना संभव नहीं है जो सभी मूल्यों के लिए काम करता है, लेकिन हमारे पास एक है जो एक को छोड़कर सभी मूल्यों के लिए काम करता है और यह सबसे अच्छा है जिसे हम प्राप्त कर सकते हैं।