was fehlt bei diesem Code?
Der Code soll ausgeben ob es sich um eine Schnapszahl handelt oder nicht aber wenn ich z.b eingebe 5555 kommt nichts in der Console raus
4 Antworten
Erstmal: Lerne, deinen Code ordentlich zu formatieren.
Dann: Deine Logik ist falsch.
Du merkst dir Nummer und die Summe der Ziffern (warum auch immer). Die While-Schleife läuft durch, bis digitSum == Nummer ist. Schon das ist fragwürdig, da bei einer Schnapszahl ja alle Zahlen gleich sein sollen. Nimmst du 5555, wäre number = 5555 und digitSum (wenn man alleine vom Namen her gehen würde) 5 + 5 + 5 + 5 = 20 ...
Dann setzt du in der While-Schleife am Anfang digitsum immer auf 0, warum auch immer und kopierst number in eine weitere Variable, um da die einzelnen Ziffern rauszubekommen.
Anschließend schaust du, ob digitSum Nummer ist und returnst dann wahr (was nicht die Bedingung für eine Schnapszahl ist), sonst erhöhst du nummer um 1 (sodass die Zahl jetzt nicht 5555, sondern 5556 ist? - warum tust du das?
Sollte diese While-Schleife je terminieren, gibst du wieder wahr zurück - warum? Was, wenn die Zahl keine Schnapszahl ist? Es gibt in deiner Logik kein return false ...
Ich hab dir doch schon gesagt, wie du es machen kannst:
Rein von der Logik: Merke dir die letzte Ziffer (per Modulo 10).
Damit ist übrigens die letzte Ziffer der ursprünglichen Zahl gemeint
Anschließend iterierst du über die Zahl (durch wiederholtes Teilen durch 10 und Modulo 10) und vergleichst die momentane Ziffer mit der gemerkten Zahl.
In deinem Beispiel mit 5555 merkst du dir also 5 (als letzte Ziffer), teilst das durch 10, hast also 555 übrig. Jetzt schaust du für jede weitere Ziffer nach dem gleichen Schema, ob sie mit der 5 übereinstimmt. Wenn nein, gibst du direkt falsch zurück.
Sonst, wenn es zum Ende durchläuft, eben wahr ...
Durchaus geht es kürzer, aber da der Fragesteller hier wohl noch Anfänger ist, fehlen Grundlagen und das Verständnis für die Logik. Das zu bekommen ist wichtiger als "ich kann das in 3 Zeilen lösen".
Schön, und genau das wollte ich nicht - fertigen Code liefern. Der Fragesteller soll selbst daran arbeiten, sonst hängt er bei der nächsten Frage wieder hier
Irgendwie seit ihr Alle in Eurer Logik auf dem Holzweg.
Eine Schnapszahl ist einfach eine (optische) Aneinanderreihung von gleichen !dezimalen! Ziffern. ...und so sollte man es auch behandeln ...ein String.
Für den den vergleich und die Bewertung von Strings ist Regex geeignet
"^(\d)\1+$"
- ^ Zeilenanfang
- (\d) ein Digit in einer Gruppe
- /1+ ein oder mehrmals das erste Match der ersten Gruppe , also das gleiche Digit
- $ Zeilenende
demo.cs
using System;
using System.Text.RegularExpressions;
class Prog{
public static bool isSchnapZahl (int Zahl){
Regex regex = new Regex(@"^(\d)\1+$"); // Regex: Zeielenanfang, ein Digit, ein oder mermals das erste Match (digit),Zeilenende
Match match = regex.Match(Zahl.ToString());
Console.WriteLine("Debugtext MATCH VALUE: " + match.Value); // Zeile kann weg
return match.Success;
}
public static void Main(string[] args){
Console.WriteLine("Schnapszahl:" + isSchnapZahl (555));
Console.WriteLine(isSchnapZahl (997));
Console.ReadKey();
}
}
..warum das Rad neue erfinden? intVar.ToString() wandelt einen (Digitalen) Integer in einen (dezimalen) String. Der Pozessor kennt keine Dezimalzahlen!
Und das RegEx überprüft ob unser SchnapszahlPattern matched...
...nagut auch bitten der Profis auch noch die Arithmetische Show:
public static bool isSchnapZahl (int Zahl){
int LastDigit=Zahl %10; //Wert der Letzen Ziffer merken
Console.WriteLine("Zahl:" + Zahl);//Mal zugucken
Console.WriteLine("Letzte Stelle:" + LastDigit);
Zahl = (int)((Zahl - LastDigit) / 10); //letzete Stelle entfernen
bool Result = true;
//wenn die Letzte Stelle eine Null ist kann es keine Scvhnapszahl sein , es gibt keine 00
//jetzt vergleichen wir brav beginnend mit der Letzen Stelle alle Dezimalen
while (Zahl > 0 & Result){
int currendDezimalDigit = Zahl %10;
Console.WriteLine("Zahl:" + Zahl); //Mal zugucken
Console.WriteLine("Letzte Stelle:" + currendDezimalDigit);
if (LastDigit != currendDezimalDigit){
Result=false ; //Abbruchkriterium für Loop und gleichzeuitig Endergebniss setzen
Console.WriteLine("Schluss wegen " + currendDezimalDigit);
}
else {
Zahl = (int)((Zahl - currendDezimalDigit) / 10);
}
}
return Result;
}
die Ausgaben in der Methode sind nur zum nachverfolgen der Logik
Solltest mal den code ordentlich formatieren, die Sprache dazu angeben (ok, vermutlich Java) und den code als Text angeben statt als Bild.
Außerdem kann man das leicht prüfen, in den man schaut ob alle Ziffern gleich sind. Also Nimmt man sich die Zahl, wandelt sie ggf. in einen String falls notwendig, nimmt das erste Zeichen und prüft alle anderen Positionen auf Gleichheit.
Du ermittelst die Quersumme - im Fall von 5555 also 20 -, vergleichst diese mit 5555, und wunderst dich, dass 20 und 5555 nicht identisch sind?
Würdest du nicht eher danach schauen wollen, ob die Ziffern alle gleich sind?
eine ziemlich sperrige Vorgehensweise