2009-10-02 16 views
5

में मैं के एंड आर पढ़ रहा हूं; अब तक मैं इसके साथ अच्छा प्रदर्शन कर रहा हूं, लेकिन itoa() में कुछ ऐसा है जो मुझे समझ में नहीं आता है। यहां itoa() में वे कहते हैं कि वे संख्याओं को खुद उलट देते हैं। उदाहरण के लिए 10 01 है (वे स्ट्रिंग रिवर्स):मुझे यह समझ में नहीं आता है() के एंड आर पुस्तक

void itoa(int n, char s[]) 
{ 
    int i, sign; 
    if ((sign = n) < 0) /* record sign */ 
     n = -n; /* make n positive */ 
    i = 0; 
    do { /* generate digits in reverse order */ 
     s[i++] = n % 10 + '0'; /* get next digit */ 
    } while ((n /= 10) > 0); /* delete it */ 
    if (sign < 0) 
     s[i++] = '-'; 
    s[i] = '\0'; 
    reverse(s); 
    return; 
} 

मुझे समझ नहीं आता कि यह कैसे संख्या को उलट दिया। भले ही हम n % 10 + '0' कर रहे हैं, तो यह निम्न अंक जो 10 तो 1 हटा दिया जाता है, तो यह 0 पर जाता है? या मुझे इसका तर्क नहीं मिला है?

+4

कृपया विराम चिह्न का उपयोग करें और रन-ऑन वाक्यों से बचें। अपने प्रश्न को पढ़ना बहुत मुश्किल है। –

+0

ध्यान दें कि यह कोड विश्वसनीय रूप से INT_MIN को परिवर्तित नहीं करता है। –

+0

@ जोनाथन आप INT_MIN के लिए पोर्टेबल के लिए खाते की क्या सिफारिश करेंगे? धन्यवाद! – sigjuice

उत्तर

12

डू-लूप लूप में, यह संख्याओं को पीछे से खींच रहा है (सबसे कम महत्वपूर्ण अंक पहले)। इसलिए, यदि आपके पास संख्या -123456789 थी, तो यह 9, फिर 8, फिर 7, आदि को संसाधित करता है

तो, जब यह शून्य-टर्मिनेटर (तीसरी से अंतिम पंक्ति) को हिट करता है, तो आपके पास "987654321" - ", जिसे फिर उलट दिया जाता है।

2

n % 10n = 10 के लिए 0 देता, तो पाश के बाद, स्ट्रिंग s01 शामिल हैं।

reverse() पर कॉल इसे ठीक करता है।

+0

yh लेकिन मैं क्या जानना चाहता हूं कि इसकी खींच संख्या कैसे पीछे से है? मॉड्यूलस ऑपरेटर द्वारा? – user182502

+0

यदि यह ऐसा करता है तो क्यों यह शेष शेष मिलता है क्योंकि मैंने गणित किया है शेष शेष हमेशा के बाद होता है। क्या वह संख्या में आखिरी संख्या है लेकिन मुझे नहीं पता कि क्यों मैं कुछ हद तक उलझन में हूं – user182502

+0

एनवीएम मिल गया यह लोल बेवकूफ था: पी – user182502

0

एल्गोरिदम कम से कम सबसे महत्वपूर्ण क्रम में अंक निर्धारित करता है। चूंकि उत्पन्न होने वाले अंकों की कुल संख्या अग्रिम में ज्ञात नहीं है, इसलिए सही स्थिति को निर्धारित नहीं किया जा सकता है क्योंकि वे उत्पन्न होते हैं - कम से कम महत्वपूर्ण अंक अंत में होगा, लेकिन 'अंत' ज्ञात नहीं है। इसलिए वे गणना के क्रम में buffered हैं (रिवर्स) और फिर ऑर्डरिंग को सही करने के लिए पूरी स्ट्रिंग को उलट दिया जाता है। इस से बचने का

एक तरह से अग्रिम में लंबाई निर्धारित करने के लिए है:

decimal_digits = (int)log10(n) + 1 ; 

लेकिन एक एफपीयू (और बहुत ही सरल FPUs के साथ कुछ) है कि स्ट्रिंग उत्क्रमण की तुलना में एक भारी काम हो जाने की संभावना है बिना उपकरणों पर।

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