2012-06-14 13 views
5

एन-बाइनरी-अंक पूर्णांक मैन्युअल रूप से मुद्रित करने के लिए स्केलेबल एल्गोरिदम क्या है जिसका मान long long में फिट नहीं है। मैं printf और दोस्तों को पता है, के साथ साथ <iostream> (जो <cstdio> पर सबसे अधिक संभावना है पिग्गी-बैक मानक प्रकार के लिए यह अंतर्निहित है, लेकिन मैं एन बाइट्स से बना एक पूर्णांक के लिए यह करने के लिए करना चाहते हैं।मैन्युअल रूप से एन-बाइट पूर्णांक

मैं इस बारे में सोचा है और थोड़ी सी गुगल हो गई, लेकिन यह हमेशा जीएमपी (एक कोडबेस मैं बिल्कुल परिचित नहीं हूं) या "प्रिंटफैफ़ का उपयोग नहीं करता" या सबसे उपयोगी "यह मुश्किल है" जैसी पूर्व-मौजूदा बड़ी लिब्रिरी का उपयोग करने के लिए नीचे आता है।

पूर्णांक मूल रूप से है:

template<size_t N> 
class Integer{ 
... 
private: 
    int8_t first; 
    uint8_t rest[N-1]; 
} 

तो डब्ल्यू एक 'Integer<4> s बाइट पुनर्व्याख्या आपको int32_t मिल जाएगा। मैं इसे एन> 8 पर स्केल करना चाहता हूं। इस समय दक्षता वास्तव में मेरी चिंता नहीं है। न तो अंतहीनता है (यह x86 के लिए है)।

+2

मुझे लगता है कि आपको दशमलव में संख्या मुद्रित करने की आवश्यकता है? – NPE

+0

@aix हाँ दशमलव विचार होगा। – rubenvb

+0

मेरी सलाह किसी भी बड़े पुस्तकालय का उपयोग करना होगा; उन पुस्तकालयों को डीबग और साबित कर दिया गया है। आपको अपने कोडिंग में त्रुटियां कैसे मिलेंगी? ऐसा नहीं है कि आप पेन और पेपर या एक्सेल में परिणामों को सत्यापित करने जा रहे हैं। – tomdemuyt

उत्तर

5

चरण 1: निर्धारित करें देखने स्ट्रिंग प्रारूप में दो की शक्तियों से युक्त तालिका:

const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...}; 

चरण 2: एक समारोह है कि स्ट्रिंग प्रारूप में दो नंबर कहते हैं लिखें।

चरण 3: अपने नंबर में बिट्स के माध्यम से Iterate और 1 बिट्स से संबंधित सभी स्ट्रिंग जोड़ें।

चरण 4: परिणाम प्रिंट करें।

मैंने इस दृष्टिकोण का उपयोग बहुत बड़े फ्लोटिंग पॉइंट नंबरों को प्रिंट करने के लिए किया था, और यह मेरे लिए ठीक काम करता था।

+0

बहुत चालाक फ्रेड! –

+2

आपको 2 की शक्तियों की तालिका की भी आवश्यकता नहीं है: केवल 2 से गुणा करने के लिए संख्या को स्वयं जोड़ें; यदि कोई बिट 1 है तो संख्या में 1 जोड़ें; दोहराना ==> लाभ – anatolyg

+0

ध्यान दें कि यह केवल सकारात्मक संख्याओं के लिए काम करता है, हालांकि यह आसानी से तय किया गया है। प्रतिभाशाली। –

2

एक दशमलव संख्या outputting के लिए एक बुनियादी पुनरावर्ती एल्गोरिदम:

void negate(Integer & number); // modifies the input 
int divide_by_10(Integer & number); // modifies the input 
bool is_zero(const Integer & number); 

void output_number(Integer number) 
{ 
    if (number.first < 0) 
    { 
     cout << "-"; 
     negate(number); 
    } 
    if (is_zero(number)) 
    { 
     cout << "0"; 
     return; 
    } 
    int remainder = divide_by_10(number); 
    if (!is_zero(number)) 
     output_number(number); 
    char digit[] = {'0', 0}; 
    digit[0] += remainder; 
    cout << digit; 
} 

मैं अब के लिए अपरिभाषित सहायक कार्यों छोड़ दिया है, शायद यह पर्याप्त है।

+0

धन्यवाद। मेरे पास कोई अंकगणित नहीं है (मैं पहले परिणाम देखने में सक्षम होना चाहता था), इसलिए मैं पहले फ्रेड के सुझाव का प्रयास करूंगा। मैं बाद में दोनों दृष्टिकोणों के प्रदर्शन की तुलना कर सकता हूं। – rubenvb

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