2009-05-06 20 views

risposta

21
public Stack<int> NumbersIn(int value) 
{ 
    if (value == 0) return new Stack<int>(); 

    var numbers = NumbersIn(value/10); 

    numbers.Push(value % 10); 

    return numbers; 
} 

var numbers = NumbersIn(987654321).ToArray(); 

alternativa senza ricorsione:

public int[] NumbersIn(int value) 
{ 
    var numbers = new Stack<int>(); 

    for(; value > 0; value /= 10) 
     numbers.Push(value % 10); 

    return numbers.ToArray(); 
} 
+0

Convertire l'elenco in un array aggiungendo .ToArray() – Scoregraphic

+0

Lo stavo facendo mentre commentavi :) –

+0

Preferenza personale di utilizzare il ciclo for piuttosto che un do-while in caso chiunque si chiede. –

2

In breve: utilizzare ciclo che dividono numero modulo 10 (%) per ottenere promemoria (ogni cifra) e metterla in matrice.

4
var x = new Stack<int>(); 
do 
{ 
    x.Push(i % 10); 
    i /= 10; 
} while (i > 0); 
return x.ToArray(); 
+1

* cough * in una serie di ints * cough * –

+0

Grazie. Aggiornato per sembrare leggermente meno sciocco :-) – marklam

5

Un'altra alternativa che non lo fanno utilizza la ricorsione e utilizza uno stack che evita riallocazione su ogni inserto (almeno per le prime 32 cifre):

var list = new Stack<int>(32); 
var remainder = 123456; 
do 
{ 
    list.Push(remainder % 10); 
    remainder /= 10; 
} while (remainder != 0); 

return list.ToArray(); 

E sì, questo metodo funziona anche per 0 e numeri negativi.

È interessante notare che conferiscono a questo algoritmo di un numero negativo -123.456 e otterrete {-1, -2, -3, -4, -5, -6}

Aggiornamento: commutata dal usando List per Stack poiché questo dà automaticamente l'ordine corretto.

+0

Grazie per il ... promemoria, @Tomalak –

+0

Cancellato già. +1 comunque. – Tomalak

-2

Ciò si converte in stringa e scorrere i personaggi, ma lo fa sorta di automatico e in un one-liner:

var i = 987654321; 
var is = i.ToString().Cast<int>().ToArray(); 
+3

Questo non funziona. Innanzitutto, otterrai una InvalidCastException. Secondo, int x = (int) '1'; non fornisce il valore 1, ma il valore Unicode per il carattere '1' che è 49. –

+3

E non puoi usare "è" come nome di variabile;) –

11

So che ci sono risposte probabilmente migliori di questo, ma qui è un altro versione:

È possibile utilizzare yield return per restituire le cifre in ordine crescente (in funzione del peso o di qualsiasi altra cosa venga chiamata).

public static IEnumerable<int> Digits(this int number) 
{ 
    do 
    { 
     yield return number % 10; 
     number /= 10; 
    } while (number > 0); 
} 

12345 => 5, 4, 3, 2, 1

+0

mi piace sempre un buon esempio di rendimento, ho +1 –

+0

anch'io è per questo che non ho potuto resistere! – Svish

1

stringhe e possono divertimento (alcune delle altre opzioni sarebbe più veloce ... ma questo è abbastanza facile)

var @is = 987654321.ToString().Select(c => c - 48).ToArray(); 
Problemi correlati