এটি সমস্ত নেতিবাচক সংখ্যার জন্য সত্য।
f (n) = অ্যাবস (এন)
দ্বিগুণ পরিপূরক পূর্ণসংখ্যার জন্য ধনাত্মক সংখ্যাগুলির চেয়ে আরও একটি নেতিবাচক সংখ্যা রয়েছে f(n) = abs(n)
বলে f(n) = n > 0 ? -n : n
সমাধানের চেয়ে আরও একটি ক্ষেত্রে বৈধ validf(n) = -abs(n)
। তোমাকে এক করে পেয়েছি ...: ডি
হালনাগাদ
না, এটি আর একটি মামলার জন্য বৈধ নয় কারণ আমি কেবল লিটবদের মন্তব্যে স্বীকৃত ... abs(Int.Min)
কেবল উপচে পড়বে ...
আমি মোড 2 তথ্য ব্যবহার করার বিষয়েও ভেবেছিলাম, তবে উপসংহারে বলা হয়েছে, এটি ... প্রাথমিক পর্যায়ে কার্যকর হয় না। যদি সঠিকভাবে করা হয় তবে এটি ব্যতীত সমস্ত সংখ্যার জন্য কাজ করবেInt.Min
এটি প্রবাহিত হবে।
হালনাগাদ
আমি এটির সাথে কিছুক্ষণ খেললাম, একটি দুর্দান্ত বিট ম্যানিপুলেশন ট্রিকের সন্ধান করছি, তবে আমি একটি দুর্দান্ত ওয়ান-লাইনার খুঁজে পেলাম না, যদিও মোড 2 সলিউশনটি একটিতে ফিট করে।
f (n) = 2n (অ্যাবস (এন)% 2) - এন + এসএনজি (এন)
সি # তে এটি নিম্নলিখিত হয়ে যায়:
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 (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 - 1 = - (n + 1) => একটি যোগ করুন
-n => উপেক্ষা করুন এবং একটি যুক্ত করুন
n + 1 => একটিকে বিয়োগ করুন
এন
একটি দৃ concrete় উদাহরণ যেমন একটি চক্র হয় +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
যে সমস্যাটি দেখা দেয় তা +4
হ'ল 3 বিট পূর্ণসংখ্যা হিসাবে প্রতিনিধিত্বযোগ্য নয়। আমরা প্রাপ্ত হবে +4
negating দ্বারা -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
দুটি ফাংশন অ্যাপ্লিকেশন পরে ভুল করে নিজেই ম্যাপ করা হয়।
সুতরাং আমরা একটি ফাংশন নির্মাণ করেছি যা সমস্ত সংখ্যার জন্য কাজ করে তবে একটি one আমরা কি আরও ভাল করতে পারি? না আমরা পারবো না. কেন? আমাদের চারটি দৈর্ঘ্যের চক্র তৈরি করতে হবে এবং চারটি মান পর্যন্ত পুরো পূর্ণসংখ্যা পরিসীমাটি কভার করতে সক্ষম। বাকি মানগুলি দুটি নির্দিষ্ট পয়েন্ট 0
এবং Int.MinValue
সেগুলি নিজের এবং দুটি স্বেচ্ছাচারিত পূর্ণসংখ্যার সাথে ম্যাপ করতে হবে x
এবং -x
এটি অবশ্যই দুটি ফাংশন অ্যাপ্লিকেশন দ্বারা একে অপরের সাথে ম্যাপ করা উচিত।
এর বিপরীতে মানচিত্র x
করতে -x
তাদের অবশ্যই একটি চারটি চক্র গঠন করতে হবে এবং এগুলি অবশ্যই চক্রের বিপরীত কোণে অবস্থিত। ফলস্বরূপ 0
এবং Int.MinValue
বিপরীত কোণেও থাকতে হবে। এটি সঠিকভাবে মানচিত্র করবে x
এবং -x
তবে দুটি স্থির পয়েন্ট 0
এবং Int.MinValue
দুটি ফাংশন অ্যাপ্লিকেশন পরে অদলবদল করবে এবং আমাদের দুটি ব্যর্থ ইনপুট রেখে দেবে। সুতরাং এটি একটি ফাংশন নির্মাণ করা সম্ভব নয় যা সমস্ত মানের জন্য কাজ করে, তবে আমাদের কাছে এমন একটি রয়েছে যা একটি বাদে সমস্ত মানের জন্য কাজ করে এবং এটিই আমরা অর্জন করতে পারি এটি সেরা।