2012-10-18 5 views
7

Ich habe die folgende Methode, die der Arbeitnehmervertragstyp basierend auf der Anzahl von 9.em i sollte die Gesamtzahl von 9 in einer ganzen Zahl gefunden, wird das Verfahren verwendet zum Abrufen die unter Klasse versucht: -Wie finde ich die Anzahl der 9s in einer ganzen Zahl

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 dem ich versuche, wie viele 9 sind in der übergebenen ganzen Zahl zu finden, aber die obige Methode wird immer Null zurück. Irgendeine Idee, was schief geht?

+1

Do u die Anzahl der Vorkommen der Ziffer 9 zählen möchten? 123498949 zurück 3? – driis

+2

Wow, Jamming eine Kreditkartennummer als 'uint'? Sie könnten nur 'Convert.ToString' und überprüfen Sie es dann (viel einfacher, IMHO). ja –

+0

die Anzahl oder 9 ... zum Beispiel in 19199 Sollte es zurückgeben 3. –

Antwort

23

Sie können mit ein wenig Linq diese einfache tun:

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

Aber tun using System.Linq; in die Datei cs hinzufügen.

Ihre Antwort funktioniert nicht, weil Sie Bytes konvertieren, wird die Anzahl an Bytes Umwandlung nicht ein Byte für jede Ziffer (via @Servy) erzeugen. Wenn Sie also jedes Byte in Ihrem Array zum Console/Debug schreiben würden, würden Sie Ihre Nummer nicht sehen.

Beispiel:

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

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

Console:

Sie jedoch die int in einen String umwandeln kann und dann prüfen, für jedes Zeichen in der Zeichenfolge wenn es eine Neun ist;

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

Würden Sie nicht brauchen 'ToCharArray()' zuerst? Oder fehlt mir eine Erweiterung für '.Select'? –

+3

Ich glaube, Sie Meant 'Where' statt von' Select', sondern mehr auf den Punkt, können Sie' .Count (c => c.Equals (9)) 'äquivalent. –

+4

@BradChristie 'string' implements'' IEnumerable . –

2

Versuchen

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

Da ein String IEnumerable<char> implementiert, können Sie LINQ direkt auf die Zeichenfolge, ohne sie zunächst zu einer Aufzählung von Zeichen zu konvertieren.


UPDATE

die uint auf ein Byte-Array-Konvertierung wird die erwartete Art und Weise nicht funktionieren, da die uint nicht die Dezimalstellen Ihrer Nummer direkt speichert. Die Nummer wird als Binärzahl gespeichert, die sich über vier Bytes erstreckt. A unit hat immer vier Bytes, auch wenn Ihre Nummer 9 Dezimalstellen hat.

Sie können die Zahl in einen String konvertieren, um seine Dezimaldarstellung zu erhalten.

+0

downvote ist nicht gut ohne Erklärung - warum der Downvote? – codingbiz

+0

Ich habe meinen Kommentar redigiert, aber für den Rekord war es nicht ich, der abstimmte. –

+0

Ihre Erklärung ist falsch. Zuallererst müssen Sie * ihn * nicht in eine Zeichenkette konvertieren, siehe Desolators Antwort. Zweitens hat es nichts damit zu tun, dass ein Byte eine Binärzahl oder eine "Einheit" mit einer Binärdarstellung ist. Wenn Sie int in Bytes umwandeln, erhalten Sie (in Wirklichkeit) eine vierstellige 256-Bit-Zahl, die gleich der Ganzzahl ist. Das Problem war, dass er jede Basis * 10 * Ziffer herausholen musste. Das ist sicher * möglich *, er hat es einfach nicht richtig gemacht. – Servy

20

Eine klassische Lösung ist wie folgt: (Wahrscheinlich dieser ist der schnellste Algorithmus Lösung zu finden, die es nur O (log n) Zeit in Anspruch nimmt.)

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; 
} 

Wie funktioniert das? Betrachten Sie ein Beispiel, n = 9943

jetzt ret = 0.

n% 10 = 3, die! = 9

n = n/10 = 994

n% 10 = 4! = 9

n = 99

a% 10 = 9, so ret = 1

n = 9

ein 10% = 9, so ret = 2

n = 0

+0

dankeaber was macht n/= 10; bedeutet –

+0

@johnG wenn Sie 'n = n/10;' eingeben, können Sie es zu 'n/= 10;' – SynerCoder

+0

@johnG gleich mit '+ =', '% =', '* =', '- = 'von der Spitze meines Kopfes – SynerCoder

Verwandte Themen