Come posso contare le cifre in un numero intero senza un cast stringa?

StackOverflow https://stackoverflow.com/questions/554521

  •  23-08-2019
  •  | 
  •  

Domanda

Temo ci sia una risposta semplice e ovvia a questa domanda. Ho bisogno di determinare quante cifre un'ampia un conteggio di elementi è, in modo che io possa pad ogni numero elemento con il minima numero di zeri iniziali necessari per mantenere l'allineamento. Per esempio, io voglio nessun zeri iniziali se il totale è <10, 1 se è tra 10 e 99, ecc.

Una soluzione potrebbe essere quella di lanciare il conteggio di articolo in una stringa e poi contare caratteri. Che schifo! C'è un modo migliore?

Edit: non avrei pensato di utilizzare il comune logaritmo (non sapevo una cosa del genere esistesse). Quindi, non ovvio - per me -. Ma sicuramente semplice

È stato utile?

Soluzione

Questo dovrebbe farlo:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;

Altri suggerimenti

int length = (int)Math.Log10(Math.Abs(number)) + 1;

Potrebbe essere necessario per tenere conto del segno negativo ..

Una soluzione più efficiente rispetto ripetuta divisione sarebbe ripetuto if con moltiplica ... esempio (Dove n è il numero il cui numero di cifre è richiesto)

unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}

Se c'è qualche ragionevole limite superiore sul conteggio elemento (ad esempio il campo a 32 bit di un int unsigned) quindi un modo migliore è quello di confrontare con i membri di alcuni array statico, per esempio.

// this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

unsigned int digits = 10;
while(n < test[digits]) --digits;

Se avete intenzione di riempire il numero in .Net, quindi

num.ToString().PadLeft(10, '0') 

potrebbe fare quello che vuoi.

È possibile utilizzare un ciclo while, che sarà probabilmente più veloce di un logaritmo perché questa utilizza l'aritmetica intero solo:

int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}

lascio come esercizio per il lettore per regolare questo algoritmo per gestire zero ei numeri negativi.

avrei postato un commento, ma il mio punteggio rappresentante non mi concederò questa distinzione.

Tutto quello che volevo sottolineare è che, anche se il registro (10) è un molto elegante (leggi: molto poche righe di codice) soluzione, è probabilmente il più tassazione sul processore

.

Credo che la risposta di jherico è probabilmente la soluzione più efficiente e quindi deve essere ricompensato in quanto tale.

Soprattutto se avete intenzione di fare questo per un sacco di numeri ..

Dal momento che un numero non ha zeri iniziali, si sta convertendo in ogni caso per aggiungerli. Io non so perché si sta cercando così difficile da evitare di trovare la lunghezza quando il risultato finale dovrà essere una stringa in ogni caso.

Una soluzione è fornita da logaritmo in base 10, un po 'eccessivo.

È possibile scorrere e cancellare da 10, contare il numero di volte che si ciclo;

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}

D'accordo, non posso resistere: l'uso /=:

#include <stdio.h>

int
main(){
        int num = 423;
        int count = 1;
        while( num /= 10)
                count ++;
        printf("Count: %d\n", count);
        return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $ 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top