2012-03-28 18 views
10

Tengo un número, por ejemplo 1234567897865; ¿cómo lo maximizo y creo 99999999999999?Cómo obtener el número máximo de una longitud particular

lo hice de esta manera:

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

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

     long maxNumber = long.Parse(maxNumString); 

lo que sería la mejor manera, y más corto adecuado para abordar esta tarea?

Respuesta

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

Para ampliar comentarios a continuación, si este problema se expresa en hexadecimal o binario, se podría hacer de manera muy sencilla utilizando operadores de desplazamiento

es decir, "tengo un número, en hexadecimal, , por ejemplo 3A67FD5C; ¿cómo lo maximizo y creo FFFFFFFF? "

que tendría que jugar con esto para asegurarse de que funciona exactamente, pero sería algo como esto:

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 tiene métodos comparables si se supera 'long'. –

+2

Esto es incorrecto. Debido a las propiedades de la aritmética de punto flotante cuando 'x = 10^n'' log (x) 'puede ser un poco más pequeño que n. Cuando esto sucede, su función devuelve '10^n-1' en lugar de' 10^(n + 1) -1'. Por ejemplo, en la aritmética de precisión doble x = 1000 da 999 en lugar de 9999 porque 'log (1000) = 2.99999999999999955591e + 00'. –

+0

ahhh ... ¡exigente! [pero correcto] Lo arreglé para manejar esto ... @adam, ¿por qué solo sugerir/proporcionar la solución usted mismo? –

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

Al igual que su respuesta mejor que aceptado. ¿Por qué molestarse con FPU cuando la CPU puede hacerlo? Más predecible que el punto flotante, menos dolor de cabeza de prueba. También ayuda a ahorrar algo de electricidad –

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

que no tienen un compilador disponible en este momento, por lo algunas conversiones adicionales de cadena/doble pueden necesitar suceder aquí.

4

Prueba esto:

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