2012-06-22 15 views
15

में अंकों की संख्या प्राप्त करें पूर्णांक की लंबाई का पता कैसे लगाएं? अगर मेरे पास ली था: इंट टेस्ट (234567545);एक int

मुझे कैसे पता चलेगा कि int कितनी देर तक है? मुझे बता रहा है कि इसमें 9 नंबर हैं ???

मैं कोशिश की है:

char buffer_length[100]; 


    // assign directly to a string. 

    sprintf(buffer_length, "%d\n", 234567545); 

    string sf = buffer_length; 


    cout <<sf.length()-1 << endl; 

लेकिन यह या अधिक साफ करने का एक आसान तरीका हो अधिकांश ...

+5

बस एक विचार: ऋणात्मक संख्याओं को कैसे संभाला जाना चाहिए? – Joey

+1

आपको यहां 'std :: string' क्यों चाहिए? आप बस एक 'strlen (buffer_length) 'कर सकते हैं। आपको '\ n' और इस प्रकार कोई' -1' की आवश्यकता नहीं है। – leemes

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer – Rishi

उत्तर

27

कैसे विभाजन के बारे में:

int length = 1; 
int x = 234567545; 
while (x /= 10) 
    length++; 

या उपयोग log10<math.h> से विधि।

नोट कि log10 रिटर्न एक double है, तो आप परिणाम समायोजित करना होगा।

+0

धन्यवाद! :) बस मुझे क्या पता होना चाहिए – user1417815

+0

6 मिनट में स्वीकार करते हुए, जैसा कि यह कहता है :) – user1417815

+2

नोट, 'लॉग (0)' है -फिनिटी और एक पूर्णांक में कनवर्ट करना यूबी है। – Potatoswatter

10

एक समारोह बनाओ:

int count_numbers (int num) { 
    int count =0; 
    while (num !=0) { 
     count++; 
     num/=10; 
    } 
    return count; 
} 
+3

यह गलत परिणाम देता है यदि num == 0. –

+2

मुझे लगता है कि –

+1

पर पहले हम एक साधारण जोड़ सकते हैं, लेकिन आपका काम काम करता है, लेकिन .. .. देर से .. लेकिन वैसे भी जो आपको +1 देने से नहीं रोकता है! – user1417815

3

अगर "i" पूर्णांक है, तो है

int len ; 

char buf[33] ; 

itoa (i, buf, 10) ; // or maybe 16 if you want base-16 ? 

len = strlen(buf) ; 

if(i < 0) 
    len-- ; // maybe if you don't want to include "-" in length ? 
+0

'buf [12] 'पर्याप्त होना चाहिए (अधिकतम 10 अंक + साइन +' \ 0 ')। – leemes

2

के रूप में नीचे

stringstream ss; 
int i = 234567545; 
ss << i; 
cout << ss.str().size() << endl; 
+0

यह काम करेगा, लेकिन यह बहुत अक्षम है। –

3
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 

    int i=2384995; 
    char buf[100]; 

    itoa(i, buf, 10); // 10 is the base decimal 

    printf("Lenght: %d\n", strlen(buf)); 


    return 0; 
} 

दिखाए आप इस के लिए उपयोग कर सकते हैं stringstream सावधान रहें कि यह एक मानक कार्य नहीं है, भले ही यह कई कंपाइलर्स द्वारा समर्थित है।

+0

'buf [12] 'पर्याप्त होना चाहिए (अधिकतम 10 अंक + साइन +' \ 0 ')। – leemes

0

इंटरनेट पर देखकर काउंटर वैरिएबल को 0 से शुरू करने की गलती करना और तब तक प्री-कंडीशन लूप परीक्षण दर्ज करना आम है जब तक कि गिनती 0 के बराबर न हो। एक डू-लूप लूप से बचने के लिए सही है इस।

unsigned udc(unsigned u) //unsigned digit count 
    { 
     unsigned c = 0; 
     do 
     ++c; 
     while ((u /= 10) != 0); 
     return c; 
    } 

यह शायद परीक्षण करने के लिए है कि क्या यू है कम से कम मामलों में जहां यू < के लिए uneccessary प्रभाग, वेतन वृद्धि, और सीएमपी निर्देश से बचने के लिए सस्ता है।

लेकिन जब उस विषय, अनुकूलन पर, तो आप बस दस की लगातार शक्तियों के खिलाफ यू का परीक्षण कर सकता है।

unsigned udc(unsigned u) //unsigned digit count 
    { 
     if (u < 10) return 1; 
     if (u < 100) return 2; 
     if (u < 1000) return 3; 
     //... 
     return 0; //number was not supported 
    } 

जो आप अंकों प्रति निर्देश बचाता है, लेकिन Inaddition हाथ से लिखने के रूप में आकर्षक, और थकाऊ नहीं किया जा रहा करने के लिए विभिन्न radixes के लिए कम अनुकूलनीय है, ऐसी स्थिति में आप बल्कि लिखने के लिए एक नियमित लिखते हैं इसे अपने कार्यक्रम में डालने से पहले दिनचर्या। क्योंकि सी केवल बहुत सीमित संख्या का समर्थन करता है, 64 बिट, 32 बिट, 16bit, 8bit, तो आप बस अपने आप को अधिकतम करने के लिए सीमित कर जब दिनचर्या पैदा सभी आकार के लाभ के लिए कर सकता है।

ऋणात्मक संख्याओं के लिए खाते, तो आप बस अगर यू < अंक की संख्या की गणना से पहले यू नकारना चाहते हैं। निश्चित रूप से पहले नियमित समर्थन हस्ताक्षर संख्याओं पर हस्ताक्षर किए।

यदि आप जानते हैं कि यू < , यह शायद आसान सिर्फ लिखने के लिए है, बजाय नियमित लेखन की।

if (u > 99) len = 3; 
    else 
    if (u > 9) len = 2; 
    else  len = 1; 
4

कोई भी इसे स्ट्रिंग में परिवर्तित करने का उल्लेख नहीं करता है, और फिर लंबाई प्राप्त करता है। मुझे यकीन है कि यह कैसे performant है नहीं कर रहा हूँ, लेकिन यह निश्चित रूप से कोड :)

int num = 123456; 
int len = to_string(num).length(); 

cout << "LENGTH of " << num << " is " << len << endl; 
// prints "LENGTH of 123456 is 6" 
-1

लेन = 1 + मंजिल (log10 (एन)) की एक पंक्ति में यह होता है; // C++ कोड lib (cmath)

+0

खराब संख्या '0' के लिए कोई प्यार क्यों नहीं? –