2012-03-28 33 views
10

Ho un numero, ad esempio 1234567897865; come faccio a massimizzare e creare 99999999999999?Come ottenere il numero massimo di una lunghezza particolare

Ho fatto questo in questo modo:

 int len = ItemNo.ToString().Length; 
     String maxNumString = ""; 

     for (int i = 0; i < len; i++) 
     { 
      maxNumString += "9"; 
     } 

     long maxNumber = long.Parse(maxNumString); 

quale sarebbe il modo migliore, una corretta e più breve per affrontare questo compito?

risposta

11
var x = 1234567897865; 
return Math.Pow(10, Math.Ceiling(Math.Log10(x+1e-6))) - 1; 

Per ampliare il commenti qui sotto, se questo problema è stato espresso in esadecimale o binario, potrebbe essere fatto molto semplicemente usando operatori di spostamento

cioè, "ho un numero, in esadecimale, , ad esempio 3A67FD5C, come posso massimizzare e creare FFFFFFFF? "

avrei dovuto giocare con questo per assicurarsi che funziona esattamente, ma sarebbe qualcosa di simile:

var x = 0x3A67FD5C; 
var p = 0; 
while((x=x>>1)>0) p++;   // count how many binary values are in the number 
    return (1L << 4*(1+p/4)) - 1; // using left shift, generate 2 to 
           // that power and subtract one 
+0

BigInteger ha metodi comparabili se si supera 'lungo'. –

+2

Questo non è corretto. A causa delle proprietà dell'aritmetica in virgola mobile quando 'x = 10^n'' log (x) 'può essere leggermente più piccolo di n. Quando ciò accade la tua funzione restituisce '10^n-1' invece di' 10^(n + 1) -1'. Ad esempio in aritmetica a doppia precisione x = 1000 dà 999 anziché 9999 perché 'log (1000) = 2.99999999999999955591e + 00'. –

+0

ahhh .... pignolo! [ma corretto]. Ho risolto il problema con questo ... @adam, perché suggerire/fornire la correzione da soli ?? –

9
long maxNumber = long.Parse(new String('9', ItemNo.ToString().Length)); 
+1

come la risposta migliore di quella accettata. Perché preoccuparsi con FPU quando la CPU può fare. Più prevedibile rispetto al virgola mobile, meno test di mal di testa. Aiuta a risparmiare un po 'di energia elettrica –

1
int numDigits = (int)Math.Ceiling(Math.Log10(number)); 
int result = (int)(Math.Pow(10, numDigits) - 1) 

Non ho un compilatore disponibile al momento, in modo da alcune stringhe aggiuntive/doppie conversioni potrebbero dover essere eseguite qui.

4

Prova questo:

int v = 1; 
do { 
    v = v * 10; 
} while (v <= number); 
return v - 1; 
Problemi correlati