Überprüfen ob eine Zahl eine bestimmte Ziffer enthält

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von h2oundco.

    Überprüfen ob eine Zahl eine bestimmte Ziffer enthält

    Hallo,

    gibt es eine Funktion die überprüft ob eine bestimmte Ziffer in eine Zahl vorkommt oder muss ich mir da selber was schreiben?

    Schonmal danke für die Antworten

    Mit freundlichen Grüßen

    h2oundco
    @Xeno: Standardlösung. Machbar aber "unschön".

    Ich denke EDR schwebte eher etwas mit Modulo und Ganzzahldivision vor. Der TE wäre vermutlich mit deiner Lösung zufrieden, aber für die Nachwelt würde ich eher folgendes vorschlagen:

    VB.NET-Quellcode

    1. Private Function EnthaeltZiffer(ByVal zahl As Integer, ziffer As Integer) As Boolean
    2. Do
    3. If zahl Mod 10 = ziffer Then Return True
    4. zahl \= 10
    5. Loop Until zahl = 0
    6. Return False
    7. End Function

    Bluespide schrieb:

    aber ich finde die lösung von xeno besser als deine.

    xeno schrieb:

    Ich blick deine auch nicht

    Wieso "auch". Bluespide hat ja nicht gesagt, dass er deine besser findet, weil er nur die versteht ... ;)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public za As Integer = 12345678
    3. Public zi As Integer = 9
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Dim stp As Stopwatch = Stopwatch.StartNew
    6. Dim b As Boolean = EnthaeltZiffer(za, zi)
    7. stp.Stop()
    8. Debug.Print("Ziffer " & stp.ElapsedTicks.ToString)
    9. End Sub
    10. Private Function EnthaeltZiffer(ByVal zahl As Integer, ziffer As Integer) As Boolean
    11. Do
    12. If zahl Mod 10 = ziffer Then Return True
    13. zahl \= 10
    14. Loop Until zahl = 0
    15. Return False
    16. End Function
    17. Private Function EnthaeltZifferString(ByVal zahl As Integer, ziffer As Integer) As Boolean
    18. Return zahl.ToString.Contains(ziffer.ToString)
    19. End Function
    20. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    21. Dim stp As Stopwatch = Stopwatch.StartNew
    22. Dim b As Boolean = EnthaeltZifferString(za, zi)
    23. stp.Stop()
    24. Debug.Print("ZifferString " & stp.ElapsedTicks.ToString)
    25. End Sub
    26. End Class


    Mit Mod und \ braucht die Funktion 0-2 Ticks. Mit Strings schon 14-21. Im Prinzip reden wir also um den Faktor 10 (mal schneller). Klar das sind "Ticks" (also 0.1 MIKROsekunden) und das spielt ja nun echt keine Rolle ... Und was wenn ich die Funktion in einer Schleife x-Mio Mal aufgerufen wird? Und nicht nur die Zeit beachten! Es werden auch 2 Strings im Speicher angelegt, die dafür sorgen, dass der GC öfter aufräumen muss.

    xeno schrieb:

    Ich blick deine auch nicht, @picoflop

    Ist nicht so schwer der Code, aber ich erklär ihn mal:

    VB.NET-Quellcode

    1. Private Function EnthaeltZiffer(ByVal zahl As Integer, ziffer As Integer) As Boolean
    2. Do
    3. If zahl Mod 10 = ziffer Then Return True ' 1)
    4. zahl \= 10 ' 2)
    5. Loop Until zahl = 0 '3)
    6. Return False
    7. End Function


    1) Die Zahl wird durch 10 dividiert, Mod zeigt aber nur den Restwert der Division an. Ergibt dieser die gesuchte Zahl (was ja so wäre wenn die letzte Ziffer in dem Fall 9 wäre) gibt die Funktion True zurück
    2) Ist das nicht so wird die Zahl durch 10 dividiert. Defakto (hoffe das schreibt man so) hat man die nächste Ziffer am Ende.
    3) Das ganze wird so oft durchlaufen bis keine Ziffern mehr da sind (Divisionsergebnis = 0)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    ich bin eher für Xenos Lösung, weil die kurz ist, und jeder Depp versteht das.
    Ich bin ja ühaupt kein Freund von Optimierungen, und solange das nicht sonstwieviele tausend Mal pro Sekunde aufgerufen wird, sollteman die Rules Of Optimization beachten - besonders die Jackson-Formulierung findich prägnant ;)

    "selber schreiben" habich geantwortet, weilich dachte, der TE könne das ja vlt.

    Und ich hab nachgedacht, warums sone Funktion nicht gibt, und kam zu Überlegungen wie:
    • kommt ja auch aufs ZahlenSystem an - etwa in Binärdarstellung gibts ja nur 2 Ziffern
    • was ist mit Kommazahlen, also etwa 2.324 ? - bei Modulo muß man da nochmal drüber hirnen, wie man das lösen will
    • was ist mit unendlich genauen Zahlen, wie Pi oder 1/3 ?
    • was ist mit 2.0 ? enthält das die Ziffer '0' oder nicht?
    • was ist mit Exponential-Schreibweise ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Und ich hab nachgedacht, warums sone Funktion nicht gibt

    Weil kein normaler Mensch die üblicherweise braucht?

    Ich hab mal die Schleife 10 Mio Mal laufen lassen und durch den Profiler gejagt. Nach 70 Sekunden habe ich die String nutzende Funktion abgebrochen und nach weiteren 5 Minuten konnte ich mir das Ergebnis anschauen.
    Die Version mit Zahlen reservierte insgesamt 0 Bytes. Die (abgebrochene) Version mit Strings hatte zu diesem Zeitpunkt insgesamt rund 100 MB alloziert. Stimmt schon: Wer optimiert, macht irgendwas falsch.

    Vielen dank für eure Antworten.

    Da ich tatsächlich zwar nicht Millionen mal aber schon einige tausmal die Funkton in einer Schleife aufgerufen wird, war die Lösung mit mod 10 für mich hilfreicher.

    Mit freundlichen Grüßen
    h2oundco