2012-10-18 14 views
7

Ho il seguente metodo che dovrebbe trovare il numero totale di 9 in un numero intero, il metodo viene utilizzato per recuperare il tipo di contratto dei dipendenti in base al numero di 9. i provato la classe di seguito: -Come posso trovare il numero di 9s in un numero intero

public class EmployeeCreditCards 
{ 
    public uint CardNumber(uint i) 
    { 
     byte[] toByte = BitConverter.GetBytes(i); 

     uint number = 0; 
     for (int n = 0; n < toByte.Length; n++) 
     { 
      if (toByte[i] == 9) 
      { 
       number = number + 1; 
      } 
     } 
     return number; 
    } 
} 

in quale sto cercando di trovare quanti 9 sono in numero intero passato, ma il metodo di cui sopra saranno sempre restituire zero. Qualche idea di cosa sta andando storto?

+1

fare u vuole contare il numero di occorrenze della cifra 9? 123498949 restituire 3? – driis

+2

Wow, disturbo di un numero di carta di credito come un 'uint'? Potresti semplicemente 'Convert.ToString' e poi controllarlo (molto più facile, IMHO). –

+0

sì il numero o 9 ... per esempio a 19199 dovrebbe restituire 3. –

risposta

23

Si può fare questo semplice, con un po 'di LINQ:

public int GetAmountOfNine(int i) 
{ 
    return i.ToString().Count(c => c.Equals('9')); 
} 

Ma fare aggiungere using System.Linq; al file cs.

La risposta non sta funzionando perché si sta convertendo al byte, convertendo il numero di byte non genera un byte per ogni cifra (via @Servy). Pertanto, se scrivessi ogni byte dell'array su console/debug, non vedresti il ​​tuo numero indietro.

Esempio:

int number = 1337; 
byte[] bytes = BitConverter.GetBytes(number); 

foreach (var b in bytes) 
{ 
    Console.Write(b); 
} 

Console:

È possibile tuttavia convertire l'int in una stringa e quindi controllare per ogni carattere della stringa se è un nove;

public int GetAmountOfNineWithOutLinq(int i) 
{ 
    var iStr = i.ToString(); 
    var numberOfNines = 0; 
    foreach(var c in iStr) 
    { 
     if(c == '9') numberOfNines++; 
    } 
    return numberOfNines; 
} 
+0

Non ti bisogno di 'ToCharArray()' prima? O mi manca un'estensione per '.Seleziona'? –

+3

Penso che volevi dire 'WHERE' invece di' select', ma più al punto, è possibile utilizzare' Count (c => c.Equals (9)) 'equivalente. –

+4

@BradChristie '' STRING' implements' IEnumerable . –

2

Prova

int numberOfNines = number.ToString().Where(c => c == '9').Count(); 

Dal momento che una stringa di implementa IEnumerable<char>, è possibile applicare LINQ direttamente alla stringa senza convertirlo ad un'enumerazione di caratteri prima.


UPDATE

Conversione del uint ad un array di byte non funziona il modo previsto, dal momento che il uint non memorizza le cifre decimali del vostro numero direttamente. Il numero è memorizzato come un numero binario che si estende su quattro byte. A unit ha sempre quattro byte, anche se il numero ha 9 cifre decimali.

È possibile convertire il numero in una stringa per ottenere la sua rappresentazione decimale.

+0

downvote non va bene senza spiegazione - perché il downvote? – codingbiz

+0

Ho redatto il mio commento, ma per la cronaca non sono stato io a votare. –

+0

La tua spiegazione è sbagliata. Prima di tutto, non * è necessario * per convertirlo in una stringa, vedere la risposta di Desolator. Secondo, non ha nulla a che fare con un byte che è un numero binario, o 'unit' con una rappresentazione binaria. Convertire l'int in byte ti darà (in effetti) un numero di base di quattro cifre, 256, che è uguale all'intero. Il problema era che doveva estrarre ogni cifra di base * 10 *. Questo è certamente * possibile *, semplicemente non lo ha fatto bene. – Servy

20

Una soluzione classica è la seguente: (Probabilmente questo è il più veloce algoritmo di per trovare una soluzione, ci vuole solo O (log n) tempo.)

private int count9(int n) 
{ 
    int ret = 0; 
    if (n < 0) 
     n = -n; 
    while (n > 0) 
    { 
     if (n % 10 == 9) ++ret; 
     n /= 10; // divide the number by 10 (delete the most right digit) 
    } 
    return ret; 
} 

Come funziona? consideri un esempio, n = 9943

ora ret = 0.

n% 10 = 3, che! = 9

n = n/10 = 994

n% 10 = 4! = 9

n = 99

un% 10 = 9, così ret = 1

n = 9

10% = 9, così ret = 2

n = 0

+0

grazie, ma cosa fa n/= 10; significa –

+0

@johnG se si digita 'n = n/10;' si può abbreviare a 'n/= 10;' – SynerCoder

+0

@johnG stesso con '+ =', '% =', '* =', '- = 'dalla cima della mia testa – SynerCoder

Problemi correlati