- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 25

Thema: Ein Zahlenproblem

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Ein Ansatz in Bascom mit 4 Ziffern aus "0" -"9" ergeben 5040 Kombinationen:
    Code:
    ' Zahlenproblem                                                                 29.7.2011 mic
    
    ' https://www.roboternetz.de/community/showthread.php?54210-Ein-Zahlenproblem
    
    $regfile = "m8def.dat"                                      ' asuro mit Mega8
    $crystal = 8000000                                          ' taktet mit 8MHz
    $baud = 2400                                                ' IR-Baudrate
    
    
    Dim Muster(10) As Byte
    Dim N(10) As Byte , M As Byte
    Dim Gefunden As Byte,
    Dim Nr As Long
    
    Print "{027}[1;1H";                                         ' Home
    Print "{027}[2J";                                           ' clear terminal screen
    Print "{027}[1m";                                           ' bold on
    Print "Zahlenproblem                                  29.7.2011 mic"
    Print "{027}[0m";                                           ' Attribute off
    Print
    
    Nr = 1
    For N(1) = 0 To 9                                           ' erste Ziffer festlegen
        Muster(1) = N(1)
    
        'If N(1) = 1 Then N(1) = 8                               ' Abkürzung!
    
        For N(2) = 0 To 9
    
          If Muster(1) <> N(2) Then                             ' wenn zweite Ziffer ungleich
             Muster(2) = N(2)                                   ' zweite Ziffer festlegen
    
             For N(3) = 0 To 9                                  ' dritte Ziffer mit den anderen Ziffern vergleichen
                 Gefunden = 0                                   ' ab hier könnte man das auch rekrusiv lösen
                 For M = 1 To 2                                 ' aber so scheint es mir übersichtlicher
                     If Muster(m) = N(3) Then Gefunden = 1
                 Next M
                 If Gefunden = 0 Then
                    Muster(3) = N(3)
    
                    For N(4) = 0 To 9                           ' n. Ziffer
                      Gefunden = 0
                      For M = 1 To 3                            ' Stellen 1 bis n-1 überprüfen
                          If Muster(m) = N(4) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then                      ' wenn schon vorhanden, Ziffer überspringen
                         Muster(4) = N(4)                       ' letzte Ziffer komplett
    
                         Print Nr ; " - " ; Muster(1) ; Muster(2) ; Muster(3) ; Muster(4)
                         Incr Nr
    
                      End If
                    Next N(4)
                 End If
             Next N(3)
          End If
        Next N(2)
    Next N(1)
    
    Decr Nr
    Print
    Print "Erzeugte Kombinationen: " ;
    Print Nr
    
    Do
    Loop
    End                                                         'end program
    [Edit]
    Weil ich ja schon fast am Ziel war habe ich mein Programm auf 10 Ziffern aufgebohrt:
    Code:
    ' Zahlenproblem                                                                 29.7.2011 mic
    
    ' https://www.roboternetz.de/community/showthread.php?54210-Ein-Zahlenproblem
    
    $regfile = "m8def.dat"                                      ' asuro mit Mega8
    $crystal = 8000000                                          ' taktet mit 8MHz
    $baud = 2400                                                ' IR-Baudrate
    
    
    Config Pind.5 = Output                                      'speaker
    
    Dim Muster(10) As Byte
    Dim N(10) As Byte , M As Byte
    Dim Gefunden As Byte,
    Dim Nr As Long
    
    Print "{027}[1;1H";                                         ' Home
    Print "{027}[2J";                                           ' clear terminal screen
    Print "{027}[1m";                                           ' bold on
    Print "Zahlenproblem                                  29.7.2011 mic"
    Print "{027}[0m";                                           ' Attribute off
    Print
    
    For Nr = 0 To 4000
       Toggle Portd.5
       Waitus 250
    Next Nr
    
    Nr = 1
    For N(1) = 0 To 9                                           ' erste Ziffer festlegen
        Print "1: " ; N(1)
        Muster(1) = N(1)
    
        'If N(1) = 1 Then N(1) = 8                               ' Abkürzung!
    
        For N(2) = 0 To 9
          Print "2: " ; N(2)
    
          If Muster(1) <> N(2) Then                             ' wenn zweite Ziffer ungleich
             Muster(2) = N(2)                                   ' zweite Ziffer festlegen
    
             For N(3) = 0 To 9                                  ' dritte Ziffer mit den anderen Ziffern vergleichen
                Print "3: " ; N(3)
                Gefunden = 0                                    ' ab hier könnte man das auch rekrusiv lösen
                For M = 1 To 2                                  ' aber so scheint es mir übersichtlicher
                   If Muster(m) = N(3) Then Gefunden = 1
                Next M
                If Gefunden = 0 Then
                    Muster(3) = N(3)
    
                    For N(4) = 0 To 9                           ' n. Ziffer
                      Gefunden = 0
                      For M = 1 To 3                            ' Stellen 1 bis n-1 überprüfen
                          If Muster(m) = N(4) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then                      ' wenn schon vorhanden, Ziffer überspringen
                         Muster(4) = N(4)                       ' letzte Ziffer komplett
    
                    For N(5) = 0 To 9
                      Gefunden = 0
                      For M = 1 To 4
                          If Muster(m) = N(5) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then
                         Muster(5) = N(5)
    
                    For N(6) = 0 To 9
                      Gefunden = 0
                      For M = 1 To 5
                          If Muster(m) = N(6) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then
                         Muster(6) = N(6)
    
                    For N(7) = 0 To 9
                      Gefunden = 0
                      For M = 1 To 6
                          If Muster(m) = N(7) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then
                         Muster(7) = N(7)
    
                    For N(8) = 0 To 9
                      Gefunden = 0
                      For M = 1 To 7
                          If Muster(m) = N(8) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then
                         Muster(8) = N(8)
    
                    For N(9) = 0 To 9
                      Gefunden = 0
                      For M = 1 To 8
                          If Muster(m) = N(9) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then
                         Muster(9) = N(9)
    
                    For N(10) = 0 To 9
                      Gefunden = 0
                      For M = 1 To 9
                          If Muster(m) = N(10) Then Gefunden = 1
                      Next M
                      If Gefunden = 0 Then
                         Muster(10) = N(10)
    
                         'Print Nr ; " - " ; Muster(1) ; Muster(2) ; Muster(3) ; Muster(4) ; Muster(5) ;
                         'Print Muster(6) ; Muster(7) ; Muster(8) ; Muster(9) ; Muster(10)
                         Incr Nr
    
                      End If
                    Next N(10)
                      End If
                    Next N(9)
                      End If
                    Next N(8)
                      End If
                    Next N(7)
                      End If
                    Next N(6)
                      End If
                    Next N(5)
                      End If
                    Next N(4)
                 End If
             Next N(3)
          End If
        Next N(2)
        Print "Zwischenstand: " ; Nr ; " Kombinationen erzeugt"
    Next N(1)
    
    Decr Nr
    
    Do
    Print
    Print "Erzeugte Kombinationen: " ;
    Print Nr
    Toggle Portd.5
    Loop
    End                                                         'end program
    Zum Debuggen lasse ich die Schleifenwerte der ersten drei Stellen ausgeben, hier der Start:
    Code:
    1: 0 ' erste Ziffer ist "0"
    2: 0 ' zweite Ziffer, "0" ist belegt,
    2: 1 ' deshalb zweite Ziffer ist "1"
    3: 0 ' dritte Ziffer, "0" ist belegt,
    3: 1 ' "1" ebenfalls, 
    3: 2 ' also ist "2" die dritte Ziffer 
    2: 3 ' ab hier wirds dann unübersichtlich, 
    3: 4 ' weil die inneren Schleifen keine Ausgabe
    3: 5 ' machen und man deshalb die Sprünge
    3: 6 ' nicht nachvollziehen kann
    2: 7
    
    ... (4 Minuten später!)...
    
    2: 9 ' zweite Stelle bei "9"
    3: 0
    3: 1
    3: 2
    3: 3
    3: 4
    3: 5
    3: 6
    3: 7
    3: 8
    3: 9 ' dritte Stelle bei "9"
    Zwischenstand: 362881 Kombinationen erzeugt
    1: 1 ' Übertrag zur ersten Stelle! Erste Ziffer ist jetzt "1" 
    2: 0
    3: 0
    3: 1
    3: 2
    3: 3
    Da der Zähler voreilt sind es in Wirklichkeit "nur" 362880 Kombinationen die mit "0" beginnen. Erfreulicherweise stimmt hier die Theorie mit der Praxis überein:
    9*8*7*6*5*4*3*2=362880 :)

    Wenn man die Zeit für die Ausgabe vernachlässigt ist mein 8MHz nach etwas mehr als 40 Minuten fertig mit allen Kombinationen...
    Geändert von radbruch (29.07.2011 um 14:29 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests