Zahl in 3 kleinere aufteilen nach System

  • Hi,

    bräuchte als Teil für mein Programm eine Funktion, die zu einer beliebigen Zahl (ASCII-Code aus 3 Buchstaben zusammengezählt) 3 kleinere Zahlen findet, deren Summe diese Zahl ist. (Beispiel: 226 -> 80+80+66)
    Die kleineren Zahlen (und das ist mein Problem) müssen zwischen 65 und 90 bzw. 97 und 122 liegen (die genannten Zahlen eingeschlossen, bei zu kleinen Zahlen 0 erlaubt).
    Ob die Zahlen gleich sind, ist egal.
    Kann mir da jemand weiterhelfen?

    Danke im Voraus
    Max

    2 Mal editiert, zuletzt von Max Matti (31. Januar 2012 um 21:09)

  • Tschuldige, falls das etwas herrisch rüberkam.
    Für die, die es nicht verstanden haben nochmal eine Kurzfassung:

    Input: 1 Zahl
    Output: 3 Zahlen, die jeweils entweder 0, zwischen 65 und 90 oder zwischen 97 und 122 sind und deren Summe dem Input entspricht
    Wie die 3 Zahlen zueinander stehen, ist egal.

  • Hatte grade langeweile^^
    Die Zahlen sind allerdings nicht sehr einfallsreich und NICHT zufallsgeneriert.
    Es wird bei dem Input von 178 immer 113+65+0 rauskommen.
    Das lässt sich bestimmt auch Mathematisch lösen statt per Switch. So gings halt grad schnell und vllt reichts für die Anwendung ja...

    Spoiler anzeigen
    [autoit]


    _Main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main()
    Local $Input, $a = '', $Geteilt, $Exe
    For $i = 0 to 1000 Step 1
    $Input = Random(0, 255, 1)
    $Geteilt = _Teilen($Input)
    $Exe = Execute($Geteilt)

    [/autoit] [autoit][/autoit] [autoit]

    If $Exe <> $Input Then
    $a = '! ### '
    Else
    $a = ''
    EndIf
    ConsoleWrite($a & $Input & ' = ' & $Geteilt & @CRLF)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Teilen($Input)
    If $Input < 65 Then Return 'Keine Teilung möglich'
    Switch $Input
    Case 65 To 129 ; Nur eine Zahl möglich
    Switch $Input
    Case 65 To 90
    Return $Input & '+0+0'
    Case 97 To 122
    Return $Input & '+0+0'
    Case Else
    Return 'Keine Teilung möglich'
    EndSwitch
    Case 130 To 194 ; Nur 2 Zahlen möglich
    Switch $Input
    Case 130 To 155
    Return $Input - 65 & '+65+0'
    Case 156 To 161
    Return $Input - 75 & '+75+0'
    Case 162 To 187
    Return $Input - 65 & '+65+0'
    Case 188 To 194
    Return $Input - 72 & '+72+0'
    EndSwitch
    Case 195 To 255 ; 3 Zahlen
    Switch $Input
    Case 195 To 212
    Return $Input - 122 & '+122+0'
    Case 213 To 220
    Return $Input - 130 & '+65+65'
    Case 221 To 245
    Return $Input - 155 & '+90+65'
    Case 246 To 255
    Return $Input - 185 & '+120+65'
    EndSwitch
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    lg
    M

  • Hier meine Brute Force Methode:

    Spoiler anzeigen
    [autoit]


    Global $aZahlen[53], $i, $j
    $aZahlen[0] = 0
    $j = 1
    For $i = 65 To 90
    $aZahlen[$j] = $i
    $j += 1
    Next
    For $i = 97 To 122
    $aZahlen[$j] = $i
    $j += 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(AQSumme(226, $aZahlen) & @LF)
    ConsoleWrite(AQSumme(333, $aZahlen) & @LF)
    ConsoleWrite(AQSumme(178, $aZahlen) & @LF)

    [/autoit] [autoit][/autoit] [autoit]

    Func AQSumme($zahl, $array) ;Brute Force
    Local $summe, $ub = UBound($array)
    Local $i = 0, $j = 0, $k = 0
    Local $a, $b, $c, $z
    While $summe <> $zahl
    $a = $array[$i]
    $b = $array[$j]
    $c = $array[$k]
    $summe = $a + $b + $c
    If $k = $ub - 1 Then $j += 1
    If $j = $ub - 1 Then $i += 1
    If $i = $ub - 1 Then Return 0
    $z += 1
    $k = Mod($z, $ub)
    WEnd
    Return $a & "+" & $b & "+" & $c & "=" & $summe ;& " / " & Chr($a) & "+" & Chr($b) & "+" & Chr($c)
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (31. Januar 2012 um 19:58)