2010-09-01 30 views
11

Esta no es una pregunta para la tarea. Todo lo que puedo pensar es dividir el número repetidamente por 10 (hasta que el número sea menor a 10) y mantener un conteo, pero ¿hay algún truco para este tipo de cosas?¿Cómo extraer cada dígito de un número?

+1

Sí, esta es la solución correcta. ¿Qué tipo de truco quieres decir? –

+0

como un truco del mal que convierto en una cadena ('sprintf' o' snprintf'), y luego 'atoi' el valor de char para que pueda obtener el número. No utiliza módulo o AFAIK la operación de división. – MrMesees

Respuesta

1

Si se trata de un número entero, podría convertir la representación de cadena en una matriz de caracteres, y luego convertir eso en una matriz de bytes (0-9)

+0

Creo que convertirlo en una representación de cadenas esencialmente dividiría repetidas veces por 10. Al menos, así es como lo haría. –

+0

¿Qué pasa si está en hexágono? – munmunbb

+0

Un número entero es un número entero, se almacena en la memoria de la misma manera, independientemente de si lo ve en decimal, hexadecimal, binario o lo que sea. ¿Estás preguntando cómo extraer los caracteres individuales en la representación * hex *? Si es así, simplemente obtenga la representación hexadecimal como una cadena, y luego tome los caracteres en esa cadena. –

9

Sí, que bastante tienen la forma matemática a hazlo allí mismo.

while (num >= 10) 
    digit = num MOD 10 // and save this into an array or whatever 
    num = num/10 

al final de este, num contendrá el último dígito.

Aquí hay una aplicación Javascript:

function getDigits(num) { 
    var digits = []; 
    while (num >= 10) { 
     digits.unshift(num % 10); 
     num = Math.floor(num/10); 
    } 
    digits.unshift(num); 
    return digits; 
} 

Tenga en cuenta que sólo funciona para los números enteros no negativos.

3

código Python usando su enfoque:

def digits(n): 
    ds = [] 
    while n > 0: 
    ds.append(n % 10) 
    n /= 10 
    ds.reverse() 
    return ds 

Usando convertation de cadena:

def digits(n):   
    return map(int, str(n)) 
7

¿Por qué implementar la conversión a sí mismo cuando ya hay una forma muy fiable para hacerlo? (Y dado que no es tarea).

En pseudo-C:

char digits[10]; 
sprintf(digits, "%d", number); 

Ahora sus dígitos matriz de caracteres (string) debe consistir de cada dígito del número. La mayoría de los otros lenguajes de scripting también contienen una función sprintf.

Esto funcionará si quiere base 8 o base 16 o binario, etc. Simplemente use un especificador de formato diferente.

+0

pero no generalizable a bases distintas de 16, 10 u 8.(el binario no tiene un especificador "%" para la versión estándar de sprintf) –

+0

Luego, si desea usarlos como dígitos reales, debe restar ''0'' de todos ellos. En cuanto a por qué ... tal vez estés haciendo algunos problemas matemáticos computacionales recreativos y no quieras ese poquito de sobrecarga. ¡Estoy seguro de que hay problemas con el proyecto euler al usar los dígitos de un número! – Cascabel

+0

Odio esta conversión a cadenas. Descomprimiré esto tan pronto como pueda. Creo que es una mala solución. – Bart

4

La respuesta matemática es modificar por 10 y agregar cada resultado a una lista, luego invertir el orden de la lista. He aquí un C# algoritmo básico que va a hacer esto:

List<byte> digits = new List<byte>(); 

while(number > 10) 
{ 
    digits.Add(number % 10); 
    number %= 10; 
} 
//add the last digit 
digits.Add(number); 

byte temp; 
for(var i=0;i<digits.Count/2;i++) 
{ 
    temp = digits[i]; 
    digits[i] = digits[digits.Count-(i+1)]; 
    digits[digits.Count-(i+1)] = temp; 
} 

Otros "trucos" por lo general implican una conversión de cadenas.He aquí un C# de una sola línea usando LINQ que dará el mismo resultado que el anterior:

var digits = number.ToString().Select(c=>byte.Parse(c)).ToList(); 
1

un algoritmo más eficiente, si sus números de entrada pueden ser grandes, es dividir por una potencia de 10, por ejemplo 1000, y utilizar una tabla de búsqueda:

s = ""; // or use a string builder appropriate to your language... 
table = {"000", "001", ..., "999"}; 
tableInitial = {"unused", "1", "2", ..., "9", "10", ..., "999"}; 
while(n >= 1000) { 
    m = n%1000; 
    n /= 1000; 
    s = table[m] + s; 
} 
s = tableInitial[n] + s; 
+0

El modding es efectivamente una operación de registro (n) para cualquier número N. No se vuelve mucho más eficiente incluso para números grandes. – KeithS

+1

@KeithS: asintóticamente, la división binaria - reduciendo el número mod 10^k con k aproximadamente log_100 N para una entrada N - da una aceleración siempre que uses división rápida (FFT o incluso Karatsuba). En términos prácticos, reducir mod la potencia más pequeña de diez menos que la raíz cuadrada del entero más grande que cabe en una palabra es tan rápido como reducir la mod 10, por lo que obtienes casi una aceleración de 9x en números grandes en una máquina de 64 bits. Puede combinar los dos enfoques al pasar del método asintótico a la práctica una vez que alcanza cierto umbral. En mi experiencia, tiene alrededor de 1000 dígitos, pero varía. – Charles

0

la solución pitón dado se podría optimizar adicionalmente usando

zerostr = ord('0') 
def digits(n): 
    return map(lambda x: ord(x)-zerostr, str(n)) 

De hecho, donde elLa conversiónestá probablemente optimizada, para obtener el valor numérico es mucho mejor usar el valor de carácter intrínseco de la cadena de dígitos, que en cada codificación (incluido EBCDIC) da el valor numérico mediante una resta int en lugar de un análisis str.

0

Aquí hay un arreglo de funciones reversibles en JavaScript que manejan números enteros o cadenas:

function reverse(array) 
{ 
    var left = null; 
    var right = null; 
    var length = array.length; 
    for (left = 0, right = length - 1; left < right; left += 1, right -= 1) 
    { 
     var temporary = array[left]; 
     array[left] = array[right]; 
     array[right] = temporary; 
    } 
    return array; 
} 

function toDigitsArrayFromInteger(integer, isReverse) 
{ 
    var digits = []; 

    if (integer > 0) 
    { 
     var floor = window.Math.floor; 
     while (integer > 0) 
     { 
      digits.push(floor(integer % 10)); 
      integer = floor(integer/10); 
     } 

     // Array is populated in reverse order. Un-reverse it to make it normal. 
     if (!isReverse) 
     { 
      digits = reverse(digits); 
     } 
    } 
    else if (integer < 0) 
    { 
     digits = toDigitsArrayFromInteger(-integer, isReverse); 
    } 
    else if (integer === 0) 
    { 
     digits.push(0); 
    } 

    return digits; 
} 

function toDigitsArrayFromString(string, isReverse) 
{ 
    var digits = []; 

    string += ""; // Coerce to string. 

    var i = null; 
    var length = string.length; 
    for (i = 0; i < length; i += 1) 
    { 
     var integer = parseInt(string.charAt(i), 10); 
     if (isFinite(integer)) 
     { 
      digits.push(integer); 
     } 
    } 

    if (isReverse) 
    { 
     digits = reverse(digits); 
    } 

    return digits; 
} 

Una vez que tenga los dígitos como una matriz, se puede revertir la matriz fácil de obtener los dígitos a partir de la izquierda o de la derecha

La función de cadena es más versátil porque puede encontrar cualquier dígito en una cadena, mientras que la función entera está limitada a enteros.

Puntos de referencia: http://jsperf.com/todigitsarray

Los puntos de referencia entre las dos funciones muestran que en Firefox 10 y Chrome 12, la función de cadena es de 30% a 60% más rápido que la función de número entero. En Opera 12, la función entera es ligeramente más rápida en aproximadamente un 10%.

0
No

segura de haber entendido correctamente lo que quiere ...

haría el siguiente trabajo para usted ?? Está escrito en C# ...

public static List<int> ExtractDigit() 
{ 
    // Input example 
    int number = 12345; 

    // Convert Integer to string 
    string numberedString = number.ToString(); 

    // Create a list of integers 
    var numList = new List<int>(); 

    // Convert each character in string back to int and add to list. 
    foreach (char c in numberedString) 
    { 
     numList.Add(Convert.ToInt32(c.ToString())); 
    } 

    return numList; 
} 

Espero haber sido de ayuda.

0

El siguiente programa funcionaría también.

public class Main { 
    public static void main(String[] args) { 
     int i1 =123456; 
     String s =new StringBuilder(String.valueOf(i1)).toString(); 
     char a[]=s.toCharArray(); 
     for(char c : a) { 
      Integer i = Integer.parseInt(c+""); 
      System.out.println(i); 
     } 
    } 
} 
0

JavaScript:

function digits(num) { 
    return String(num).split('').map(v => +v); 
} 
Cuestiones relacionadas