2016-08-04 28 views
0

Ich habe eine Funktion, die eine Liste von Zahlen aufnimmt und zurückgibt, wie viele gerade Zahlen und ungerade Zahlen gibt es in der Liste. Ich habe jedoch eine Liste von Zahlen übergeben, aber ich bekomme 0 Ergebnisse.Code nicht zurück zu erwartende Anzahl von geraden und Chancen

Hier ist meine Funktion -

public static string HowManyEvenAndOdds(List<int> numbers) 
    { 
    int numOfOdds = 0; 
    int numOfEvens = 0; 
    int numOfBoth = 0; 

    foreach (int i in numbers) { 
     bool isEven = i % 2 == 0; 
     bool isOdd = i % 3 == 0; 

     numOfBoth = isEven && isOdd ? numOfBoth++ : numOfBoth; 
     numOfEvens = isEven ? numOfEvens++ : numOfEvens; 
     numOfOdds = isOdd ? numOfOdds++ : numOfOdds; 
    } 

    return string.Format("This list has {0} odd numbers,\n{1} even numbers,\nand {2} numbers that are even and odd.", numOfOdds, numOfEvens, numOfBoth); 

    } 

Alle Ideen, was ich falsch hier? Ich debuggte durch, aber keine der Listen inkrementieren.

Dank

+4

Eine [ungerade Zahl] (https://simple.wikipedia.org/wiki/Odd_number) ist definiert als "eine Zahl, die kein Vielfaches von 2 ist". 'i% 3 == 0' ist ** nicht **, wie Sie für ungerade Zahlen testen. Und keine Zahl kann sowohl gerade als auch ungerade sein. –

+0

Versehentlich gelöscht mein Kommentar ... sicherlich 'numOfBoth' sollte entweder nur die Gesamtzahl durchgereicht werden, z. 'numOfBoth = numOfEvens + numOfOdds' oder, ich bin nicht sicher, was es sonst noch wäre – Josh

+0

@ p.s.w.g Ich denke, ich habe das übertrieben. –

Antwort

4

Ich stimme mit Schachaf Görtler's Antwort sowie pswgs Kommentar. Just do:

foreach (var number in numbers) 
{ 
    // A number is even if, and only if, it's evenly divisible by 2 
    if (number % 2 == 0) 
     numEvens++; 
    // A number is odd if, and only if, it's NOT evenly divisible by 2 
    // Alternatively, a number is odd if it isn't even and vice versa 
    else 
     numOdds++; 
} 

Als p.s.g. erwähnt, gibt es nicht so etwas wie eine gerade und ungerade Zahl, also eliminiere das komplett.

Übrigens ruft numOfEvens ++ den Wert und dann erhöht es, weshalb Ihr Code nicht funktioniert hat.

+0

Sie müssen nicht andere Antworten und Kommentare in _your_ Antwort angeben, nur der Code wird ausreichen. – stuartd

+0

Das hat funktioniert! Aber ich bin verwirrt, warum mein Ausdruck nicht lief. Als ich numOfEvens = isEven geschrieben habe? numOfEvens ++: numOfEvens; Es hielt numOfEvens als 0. –

+0

Ja, danke, Tippfehler meinerseits. – EJoshuaS

5

Ihr in der richtigen Art und Weise i% nicht ungerade sind die Berechnung 3 nicht 5, die auch eine ungerade Zahl ist verfängt, versuchen Sie dies stattdessen

bool isEven = i % 2 == 0; 
bool isOdd =!isEven; 
+0

Wahr - der Test für ungerade Zahlen verpasst auch ein * Los * anderer ungeraden Zahlen, wie 1, 7, 11, 13 und 17. Tatsächlich vermisst er * jede * Primzahl per Definition, plus viel Primzahlen wie 5 und 25. – EJoshuaS

1

ich glaube, Sie haben einen Blick sollte bei Ihrem Test für isOdd

1

Verwenden Sie die Linq Count Erweiterung.

int numOfOdds = numbers.Count(x => x % 2 != 0); 
int numOfEvens = numbers.Count(x => x % 2 == 0); 

Natürlich müssen Sie nicht beide Ausdrücke bewerten, wie im folgenden Kommentar.

+1

Keine Notwendigkeit, die Liste zweimal aufzuzählen. 'numOfEvents = numbers.Count - numOfOdds;' –

+0

Sicher, ich wollte sie beide einfach als unabhängig anzeigen. Ich stimme Ihnen zu: Wir brauchen nicht beide zusammen –