2010-07-28 13 views
5

मेरा 15 साल का छोटा भाई प्रोग्रामिंग शुरू कर रहा है, और उसने एक साफ-सुथरा छोटा कार्यक्रम लिखा जो अक्षरों और संख्याओं के सभी संयोजनों को आउटपुट करता है जो छह अंक या उससे कम हैं। उसका कोड लूप के लिए एक सेक्स्टुप-नेस्टेड था जो छः स्तर के चार सरणी के तत्वों को अद्यतन करता था। यह बुरा लग रहा था, लेकिन निश्चित रूप से तेज़ था! मैंने उसे दिखाया कि एक साधारण गिनती कैसे करें, और उन नंबरों को आधार 36 में परिवर्तित करें।मैं सी ++ में एक अलग संख्या बेस में कैसे गिन सकता हूं?

सबसे बड़ी समस्या यह है कि मेरे द्वारा किए गए विभाजन के कारण मेरा कोड इतना धीमा था। क्या कोई तरीका है कि मैं बस बेस 36 मान सकता हूं और 1 से 36^6 तक गिनती आउटपुट कर सकता हूं? , एक संचायक बनाने के लिए और शुरू पर्याप्त रूप से उच्च डिग्री से उदाहरण 36^6 के लिए:

आदर्श रूप में, मैं की तरह

[base 36] 
for(int i = 0; i < 1000000; i++) 
    SaveForLaterFileOutput(i); 
+6

आप प्रस्तुति के साथ भ्रमित मूल्य हैं। शुद्ध गिनती एक अवधारणा नहीं है जिसे रेडिक्स दिया जा सकता है। एक रिफैक्टर संस्करण आपके भाई का समाधान दोनों के बेहतर हो सकता है! –

+0

भाषा में कोई अंतर्निहित बेस 36 निर्माण नहीं है। हालांकि, आपको जो भी चाहिए वो करने के लिए आपको विभाजन की आवश्यकता नहीं है। – driis

उत्तर

3

इस प्रयास करें:

char buffer[1024]; 
for(int i = 0; i < 1000000; i++) 
     cout << itoa (i, buffer, 36); 

यहाँ यह itoa के बिना है (यदि आप इसे ज़रूरत नहीं है)

cout << setbase (36); 
for(int i = 0; i < 1000000; i++) 
     cout << i << endl; 
cout << setbase (10); // if you intend to keep using cout 

+2

'itoa' मानक में नहीं है और सभी सी ++ पुस्तकालयों में यह शामिल नहीं है। –

+0

यह सुनिश्चित करता है कि यह चाल है। धन्यवाद। – Jeffrey

+0

इसके बिना उत्तर देने के लिए अपडेट किया गया (धन्यवाद @ कोनराड रुडॉल्फ) –

1

36 के आधार के लिए एक नंबर परिवर्तित करने के लिए कुछ करने के लिए देख रहा हूँ। यदि संचयक प्लस वह संख्या आपकी संख्या से कम है, तो इसे संचयक में जोड़ें और उसी डिग्री के लिए दोहराएं (इसकी गणना अंक मान है), यदि यह अधिक है, तो इसे दूर फेंक दें। जब तक आप 36^0 तक नहीं पहुंच जाते, तब तक निम्न डिग्री के लिए दोहराएं। प्रत्येक डिग्री के लिए गिनती का ट्रैक रखें, और यह आधार 36 में आपकी संख्या है।

इसे सार्थक तरीके से प्रिंट करने के लिए, कुछ और करें।

1

सभी गणना में उपयोग किया संख्या आधार 2 में हैं आप जो भी अन्य नंबर देखते हैं वह सिर्फ एक भ्रम है कि यह कैसे मुद्रित होता है। इसलिए आपका SaveForLaterOutput व्यर्थ है।

लाइब्रेरी फ़ंक्शन itoa() (जो "ASCII के लिए पूर्णांक" में अनुवाद करता है) (इन दिनों इसे सुरक्षित _itoa_s() फ़ंक्शन द्वारा प्रतिस्थापित किया गया है) आउटपुट की तैयारी करते समय आपको आधार निर्दिष्ट करने की अनुमति देता है।

+0

बाइनरी में "2" जैसी कोई चीज़ नहीं है, इसलिए तकनीकी रूप से, सभी गणना बेस 10 बाइनरी में हैं (संख्या दस के साथ भ्रमित नहीं होने के कारण हम इंसानों को इतना पसंद करते हैं)। – fredoverflow

+0

दुनिया में केवल 10 प्रकार के लोग हैं: जो बाइनरी समझते हैं और जो नहीं करते हैं। –

+0

10 प्रकार के लोग हैं: जो लोग टर्नरी समझते हैं, जो नहीं करते हैं और जो इसे बाइनरी के लिए गलती करते हैं;) –

2

आपके भाई के लिए 6 नेस्टेड लूप की आवश्यकता के बिना 6-तत्व सरणी को अपडेट करना संभव है। नीचे increment समारोह को संशोधित करके, आप किसी "आधार" में भरोसा कर सकते हैं आप चुनते हैं:

#include <algorithm> 
#include <iostream> 

#define NUM_CHARS 6 

// assuming ASCII 
// advances through a chosen sequence 0 .. 9, a .. z 
// or returns -1 on overflow 
char increment(char &c) { 
    if (c == 'z') return -1; 
    if (c == '9') { c = 'a'; return c; } 
    return ++c; 
} 

int main() { 
    char source[NUM_CHARS+1] = {0}; 
    std::fill_n(&source[0], NUM_CHARS, '0'); 
    while (true) { 
     std::cout << source << "\n"; 
     int idx = NUM_CHARS; 
     // increment and test for overflow 
     while (increment(source[--idx]) == -1) { 
      // overflow occurred: carry the 1 
      source[idx] = '0'; 
      if (idx == 0) return 0; 
     } 
    } 
} 

मैं इस समस्या का "या इससे कम" भाग के साथ परेशान नहीं है लेकिन आप इसे 6 छोरों के साथ किया है शायद इस तकनीक के साथ भी काम करेंगे। कड़ाई से बोलते हुए, यह संयोजनों की गणना कर रहा है, जो लगभग गिनती के समान ही नहीं है।

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