2010-12-22 10 views
11

मैं सी ++ में बिगइंटर क्लास को कार्यान्वित करने की कोशिश कर रहा हूं। लेकिन, सबसे पहले, मेरे पास एक मूल प्रश्न है, "बेस डेटा" का प्रतिनिधित्व कैसे किया जा सकता है? उदाहरण के लिए, सबसे बेवकूफ तरीका चार की एक निश्चित (या गतिशील) सरणी है और चार में एक पूर्णांक की प्रत्येक संख्या को स्टोर करना है। लेकिन, ठीक है, यह एक बहुत बेवकूफ तरीका है, और मैं यहां आपके सुझावों के लिए हूं।सी ++ बिग इंटीजर

+2

संभावित डुप्लिकेट [सी ++ में बड़े int को कैसे कार्यान्वित करें] (http://stackoverflow.com/questions/269268/how-to-implement-big-int-in-c) – darioo

+0

यदि आप बहु प्रदर्शन करना चाहते हैं -प्रसिद्ध गणित स्वयं, तो मेरा सुझाव है कि आप डोनाल्ड Knuth की [आर्ट ऑफ कंप्यूटर प्रोग्रामिंग] (https://en.wikipedia.org/wiki/The_Art_of_Computer_Programming) पर एक नज़र डालें। मेरा मानना ​​है कि वॉल्यूम II, सेमिन्यूमेरिकल एल्गोरिदम, अध्याय 4, एकाधिक प्रेसिजन अंकगणित, आप इसमें रुचि रखते हैं। यह भी देखें [सी ++ में 2 मनमाने ढंग से आकार वाले पूर्णांक कैसे जोड़ें?] (Https://stackoverflow.com/q/2926219/608639), जो कुछ सी ++ पुस्तकालयों और ओपनएसएसएल के लिए कोड प्रदान करता है। – jww

उत्तर

10

वहाँ सुझावों की एक गुच्छा मौजूदा कार्यान्वयन के लिए यहां हैं: C++ handling very large integers

आप अपने खुद के (होमवर्क के लिए उदाहरण के लिए) को लागू करने की है, तो आप सबसे अच्छा तरीका तय करने के लिए है, और कैसे "बड़ी" आप की जरूरत है संभाल। आप डीडब्ल्यूओआरएस की एक सरणी का उपयोग कर सकते हैं, और एक से दूसरे तक बहने वाले हैंडल कर सकते हैं।

हालांकि, कुछ परियोजना यूलर सामग्री के लिए, मैंने वास्तव में एक स्ट्रिंग पर निर्मित बिग नम्बर क्लास को कार्यान्वित किया। यह + - */के लिए कार्यान्वित करने के लिए सबसे सरल साबित हुआ, और कुछ unsigned long long एस के साथ प्राप्त होने से काफी अधिक संख्या में स्केल किया गया। और प्रदर्शन उन पहेली को हल करने के लिए पूरी तरह से पर्याप्त था।

तो, आप कार्यान्वयन और इष्टतम प्रदर्शन की आसानी के बीच एक व्यापार समझौते का सामना करते हैं। मज़े करें ;-)

4

आप वर्णन के तरीके में एक बड़ा पूर्णांक बना सकते हैं। वास्तव में, पहली बार मैंने इस तरह के एक वर्ग को लागू किया, यह वैसे ही मैंने किया है। इससे मुझे अंकगणितीय परिचालनों को लागू करने में मदद मिली (+, -, आदि) क्योंकि यह आधार (10) में था जिसका उपयोग मैंने किया था।

आपके "सरणी की सरणी" में प्राकृतिक वृद्धि इसे आधार 10 में रखना है, लेकिन पूरे बाइट की बजाय अंक के लिए 4 बिट्स का उपयोग करें। इस प्रकार, संख्या 123,456 स्ट्रिंग 123456 स्ट्रिंग के बजाय बाइट 12 34 56 द्वारा प्रदर्शित की जा सकती है। (छह बाइट्स के विपरीत तीन बाइट्स।)

वहां से, आप आधार दो में नंबर के लिए संग्रहण कर सकते हैं। बुनियादी अंकगणितीय परिचालन जैसे कि आधार 2 में समान रूप से समान रूप से समान कार्य करते हैं। इस प्रकार, संख्या 65565 बाइट FF FF बाइट्स का उपयोग करके संग्रहीत किया जा सकता है। (unsigned char एस के वेक्टर में, उदाहरण के लिए।) बिगइंट्स के कुछ कार्यान्वयन दक्षता के लिए short या long जैसे बड़े हिस्सों का उपयोग करते हैं।

बेस -10 बड़ी चींटियां उपयोगी हो सकती हैं यदि आप बेस -10 में बहुत सारे प्रदर्शन और/या क्रमबद्ध कर रहे हैं, और बेस -2 में रूपांतरण से बचना चाहते हैं।

संबंधित मुद्दे