was fehlt bei diesem Code?

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 ...

Woher ich das weiß:Studium / Ausbildung – Abgeschlossenes Studium der Informatik (B.Sc.)
Erzesel  18.04.2023, 08:02

eine ziemlich sperrige Vorgehensweise

0
xxxcyberxxx  18.04.2023, 09:15
@Erzesel

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".

0
xxxcyberxxx  18.04.2023, 17:20
@Erzesel

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

0

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...

Erzesel  18.04.2023, 16:56

...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

0

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.

Erzesel  18.04.2023, 07:59

genau die richtige Denkweise.

1

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?