संकट:
अपनी पसंद की भाषा में, सबसे छोटा फंक्शन लिखिए जो एक अहस्ताक्षरित 64-बिट पूर्णांक के वर्गमूल के फर्श को लौटाता है।
परीक्षण के मामलों:
आपके इनपुट को सभी इनपुट के लिए सही ढंग से काम करना चाहिए, लेकिन यहां कुछ ऐसे हैं जो विचार को दर्शाने में मदद करते हैं:
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
नियम:
- आप अपने फंक्शन को कुछ भी नाम दे सकते हैं। (अनाम, अनाम या लंबोदर फ़ंक्शन ठीक हैं, जब तक कि वे किसी तरह कॉल करने योग्य हों।)
- चरित्र की गिनती इस चुनौती में सबसे ज्यादा मायने रखती है, लेकिन रनटाइम भी महत्वपूर्ण है। मुझे यकीन है कि आप ओ (timen) समय में उत्तर के लिए ऊपर की ओर स्कैन कर सकते हैं एक बहुत ही छोटी वर्ण गणना के साथ, लेकिन O (लॉग (n)) का समय वास्तव में बेहतर होगा (यानी, n का इनपुट मान मानते हुए, n की थोड़ी लंबाई नहीं)।
- आप शायद विशुद्ध रूप से पूर्णांक और / या बूलियन आर्टिथमिक का उपयोग करके फ़ंक्शन को लागू करना चाहेंगे। हालांकि, यदि आप वास्तव में फ्लोटिंग-पॉइंट गणनाओं का उपयोग करना चाहते हैं, तो यह तब तक ठीक है जब तक आप कोई लाइब्रेरी फ़ंक्शन नहीं कहते हैं। तो, बस
return (n>0)?(uint32_t)sqrtl(n):-1;
सी में यह कहना सही सीमा है कि यह सही परिणाम देगा। आप फ्लोटिंग प्वाइंट अंकगणित का प्रयोग कर रहे हैं, आप का उपयोग कर सकते हैं*
,/
,+
,-
, और घातांक (जैसे,**
या^
अगर यह एक निर्मित में पसंद की अपनी भाषा में ऑपरेटर, लेकिन है केवल शक्तियों का घातांक 1 से कम नहीं )। यह प्रतिबंध कॉलsqrt()
या एक प्रकार से "धोखा" को रोकने या। शक्ति के लिए एक मूल्य बढ़ाने के लिए है। - यदि आप फ्लोटिंग-पॉइंट ऑपरेशंस (# 3 देखें) का उपयोग कर रहे हैं, तो आपको आवश्यक नहीं है कि रिटर्न टाइप पूर्णांक हो; केवल यह कि वापसी मूल्य एक पूर्णांक, उदाहरण के लिए, फर्श (sqrt (n)) है, और किसी भी अहस्ताक्षरित 32-बिट मान को रखने में सक्षम है।
- यदि आप C / C ++ का उपयोग कर रहे हैं, तो आप अहस्ताक्षरित 64-बिट और 32-बिट पूर्णांक प्रकारों, जैसे,
uint64_t
औरuint32_t
में परिभाषित के अस्तित्व को मान सकते हैंstdint.h
। अन्यथा, केवल यह सुनिश्चित करें कि आपका पूर्णांक प्रकार 64-बिट अहस्ताक्षरित पूर्णांक रखने में सक्षम है। - यदि आपका लैंग्वेज 64-बिट पूर्णांक का समर्थन नहीं करता है (उदाहरण के लिए, ब्रेनफक जाहिर तौर पर केवल 8-बिट पूर्णांक समर्थन है), तो उसके साथ अपना सर्वश्रेष्ठ करें और अपने उत्तर शीर्षक में सीमा का वर्णन करें। उस ने कहा, यदि आप यह जान सकते हैं कि 64-बिट पूर्णांक को कैसे एन्कोड किया जाए और 8-बिट आदिम अंकगणित का उपयोग करके सही ढंग से इसका वर्गमूल प्राप्त किया जाए, तो आपके लिए और अधिक शक्ति!
- मज़े करो और रचनात्मक हो जाओ!
O(log_2 n) === O(log_4 n)
। log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2