2010-09-29 23 views

risposta

4

Un po 'difficile da gestire numeri negativi e il caso in cui l'ingresso è zero:

int length(int n) 
{ 
    int len = 0; 
    if (n < 0) { len = 1; n = -n; } 
    while (n > 9) { 
     n /= 10; 
     len++; 
    } 
    return len+1; 
} 
+0

+1 per un approccio attento e veloce. La specifica prevedeva il conteggio delle cifre, quindi non è necessario impostare separatamente i valori negativi. Può avviare len a 1 e restituire len. –

6

Non esiste funzione disponibile nella libreria C++. Tuttavia è possibile utilizzare std::stringstream per semplicità.

Prova questo (gestisce anche i numeri negativi).

int a =-12345,x; 
    x = std::abs(a) 
    std::stringstream s; 
    s << x; 
    std::cout<<s.str().size(); 
+1

La localizzazione e il factoring sono buoni: 'x = a <0? -a: a; ', ma dovrei mollare x e mettere quell'espressione direttamente nel flusso. Molto C++, ma molto pesante. –

2

È necessario continuare a dividerlo per 10 (presupponendo che sia un numero intero). Lo fai perché rimuovi una cifra ogni volta che il ciclo itera.

qualcosa sulla falsariga di:

int number; 
int digits; 
while (number > 0) 
{ 
    digits++; 
    number /= 10; 
} 

Probabilmente si vorrà per assicurarsi che il numero non è pari a zero per cominciare.

2
int intlen(float num) { 
    int cnt = 0; 
    while(num >= 1) { 
     num = num/10; 
     cnt++; 
    } 
    return cnt; 
} 
+0

Il numero 0 contiene 0 cifre? – dreamlax

+0

I numeri negativi non hanno cifre? – dreamlax

10

Per i numeri positivi, utilizzare log10:

int a = 1234; 
int len = static_cast<int>(log10(a)+1.); 

Se avete bisogno di essere approfondito:

int length(int a) 
{ 
    int b = abs(a); 
    if (b == 0) return 1; 
    return static_cast<int>(log10(b)+1.); 
} 

Detto questo, sarebbe una scelta migliore per fare la divisione ripetuta da 10 in pratica.

int length(int a) 
{ 
    int b = 0; 
    for (a = abs(a); a != 0; b++, a /= 10) continue; 
    return b; 
} 
+1

Inizia la domanda, lo standard consente un'implementazione in cui dire 'log10 (10)' restituisce 0.9999999999 ...? Semplicemente non so (o mi fido delle implementazioni da rispettare come faranno qualunque cosa faccia il loro hardware), quindi preferisco l'approccio int per cifra anche se questo è matematicamente più elegante. Pensieri? –

+0

Questo sottostima di 1 - es. per il tuo esempio 1234, restituisce 3. Inoltre, non viene compilato (almeno in VC++) perché la chiamata a log10 è ambigua - è necessario eseguire il cast esplicito per il primo a un doppio. E immagino che intendessi passare b in log10 invece di un? – Peter

+0

Sei fuori di testa. log10 (5) è 0.6989700 ... quando lo si restituisce a un int, si ottiene 0. '5' ha certamente più di zero cifre. Inoltre, prendi gli addominali (a) e li metti in b, ma poi vai avanti e prendi il log10 di (possibilmente non positivo) comunque – SingleNegationElimination

7

Probabilmente significa che avete una stringa contenente numeri, piuttosto che un int in pitone:

>>> i = 123456789 
>>> len(i) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: object of type 'int' has no len() 
>>> len(str(i)) 
9 

Se questo è anche il caso in C++ è facile trovare la lunghezza di una stringa utilizzando:

my_str_value.length() 

o di una stringa C utilizzando strlen

0

Ecco un littl E Esempio:

int numberDigits(int n) { 
    char buffer[100]; 
    itoa(n,buffer,10); 
    int len=0; 
    while (buffer[len]!=0) { len++; } 
    return len; 
} 
+0

Worth lista come alternativa. Dovrebbe saltare qualsiasi "-" iniziale. Nonostante evitando strlen(), solo l'atoi() è sicuro di essere più lento rispetto ad altre soluzioni div-by-10 .... –

+0

che sarebbe un problema se la velocità è molto sensibile nella sua domanda. –

5

Hmm ... Python:

>>> len(5) 

Traceback (most recent call last): 
    File "<pyshell#45>", line 1, in <module> 
    len(5) 
TypeError: object of type 'int' has no len() 

non quello che volevi?

beh, supponiamo di avere un intero effettivo. la base di log 10 ti dirà cosa vuoi sapere numericamente, ovvero se yournumber == pow(10, digits), quindi log10(yournumber) == digits! sfortunatamente, se il tuo numero non è una potenza esatta di 10, avrai una parte frazione da gestire. Questo è abbastanza facile da affrontare, però, con la funzione floor(), che si conclude semplicemente. diffidare dei numeri negativi, poiché i logaritmi non sono definiti nei numeri reali per i valori non positivi.

#include <iostream> 
#include <math.h> 

int main() 
{ 
    std::cout << floor(log10(5))+1 << std::endl; 
    std::cout << floor(log10(30))+1 << std::endl; 
    std::cout << floor(log10(2000))+1 << std::endl; 
    std::cout << floor(log10(16000))+1 << std::endl; 
} 

dobbiamo aggiungere 1 perché 10 al 1 ° è ancora 10, quindi siamo fuori da uno. Aggiungi uno all'esponente e hai cifre!

+0

Ottima spiegazione.+1 Come ti senti riguardo ai possibili problemi di precisione con virgola mobile che sono stati sollevati nei commenti della mia risposta? – JoshD

+0

@JoshD: beh, 'log10 (x)' non è definito per x non positivi, ma a parte questo problema, questo sarà sempre corretto. Si noti che 'log10 (10.0)' è esattamente 1.0. il piano di questo è 1, 1 + 1 è due. – SingleNegationElimination

0

Ignorando per il momento che len() in pitone restituisce il numero di elementi in una sequenza e non il numero di cifre di un numero intero, ecco una funzione per contare il numero di cifre di un numero intero senza divisoria (Così dovrebbe essere molto più veloce delle soluzioni simili che usano la divisione).

int number_of_digits(int value) 
{ 
    int count = 0; 
    int i = 1; 

    if (value < 0) 
    { 
     value *= -1; 
    } 

    while (i < value) 
    { 
     count++; 
     i *= 10; 
    } 

    if (count > 0) 
    { 
     return count; 
    } 
    else 
    { 
     return 1; 
    } 
} 

Per la velocità in più, si può anche sostituire la moltiplicazione per dieci con una certa punta giocherellando:

i = ((i << 2) + i) << 1; 

(Lo spostamento bit è fresco, ma la moltiplicazione può essere "libero" se la CPU può pipeline la moltiplicazione su qualche unità di moltiplicazione altrimenti inutilizzata - i processori moderni sono una cosa di bellezza).

Problemi correlati