Brute Force

03/31/2012 19:13 ehauser#1
Hi,ich krieg es nicht hin einen "Brute Force" Algorithmus in C++ zu schreiben.
Das Prog soll alle Möglichkeiten von Zahlenkombinationen ausgeben.

Bsp.

Zahlen: 1,2
Stellenanzahl: 2

Das soll ausgegeben werden:

12
11
21
22

Man soll die Zahlen und Stellenanzahl eingeben können.

Könnt ihr mir einen Rat geben,wie das geht?
03/31/2012 19:30 Nightblizard#2
Spoonfeeding ist hier nicht so angesagt. :)
Zeig doch ersteinmal was du bisher gemacht hast und erklär was du dir dabei gedacht hast.

Falls du selber basteln willst ein paar dezente Hinweise:
Schleife
Modulo Operator (%)
if
03/31/2012 20:12 xNopex#3
[Only registered and activated users can see links. Click Here To Register...]
03/31/2012 21:34 link#4
Ein Bruteforce-Algorithmus besteht allerdings nicht aus reiner Permutation:

Bruteforce 112 -> 113 -> 114 -> ...
Permutation 112 -> 121 -> 211 -> ...

Hatte mal 'nen kleinen MD5 Bruteforcer geschrieben:
[Only registered and activated users can see links. Click Here To Register...]

So sah meine Funktion aus, die den String erstellt:
Code:
; in bl kommt die Anfangs- und in bh die Endlänge
; z.B. 3 und 4 => 000 -> zzzz
; _string_var ist einfach ein Char-Array

_09az:
        inc     bh
        mov     al,'0'
        mov     edi,_string_var
        movzx   ecx,bl
        rep     stosb
        mov     byte [edi],0
        mov     esi,_string_var
        mov     edi,.loop
        jmp     .print
        align   4
    .reset:
        mov     esi,_string_var
        mov     edi,.loop
    .loop:
        mov     al,[esi]
        mov     cl,[esi]
        cmp     al,'z'
        je      .bound
        inc     cl
        cmp     al,'9'
        je      .toa
    .set:
        mov     [esi],cl
    .print:
        ; _string_var enthält den String
        jmp     edi
        align   4
    .bound:
        mov     byte [esi],'0'
        mov     al,[esi+1]
        mov     edi,.reset
        inc     esi
        test   al,al
        jnz     .loop
        inc     bl
        mov     word [esi],30h
        cmp     bl,bh
        jnz     .print
        jmp     not_found
        align   4
    .toa:
        mov     cl,'a'
        jmp     .set
03/31/2012 21:40 ehauser#5
äh assembler kann ich jetzt nicht wirklich lesen ...
ich frag mich nur wie es geht,dass der string länger wird und der bruteforce trotzdem funktioniert?

So hab ichs mir gedacht:

char bstr[30];
bstr[0] = 'A';
bstr[1] = 'A';

for(bstr[0];bstr[0]!='z';bstr[0]++)
{
for(bstr[1];bstr[1]!='z';bstr[1]++)
{
cout << bstr << endl;
}
bstr[1] = 'A';
}

Aber das geht nicht,wenn man die chars und die Stellen frei wählen kann.
03/31/2012 22:00 xNopex#6
Sowas vllt.?

EDIT: doch nich...

EDIT2: Jetzt aber (hoffentlich)

EDIT3: jaja Macht der Java-Gewohnheit. Den Speicher sollte man vllt wieder freiräumen iwann...

Code:
#include <iostream>
#include <algorithm>
#include <cstring>

void rekPerm(int pos, int* numbers, int len, int places)
{
    for(int i = pos+1; i <= len-places+1; i++)
    {
        int* buffer = new int[places];
        buffer[0] = numbers[pos];
        for(int j = 1; j < places; j++)
        {
            buffer[j] = numbers[i+j-1];
        }
        std::sort(buffer,buffer+places);
        do
        {
            for(int k = 0; k < places; k++)
            {
                std::cout << buffer[k] << " ";
            }
            std::cout << "\n";
        }while(std::next_permutation(buffer,buffer+places));
        delete[] buffer;
    }
    pos++;
    if(pos <= len-places)
        rekPerm(pos, numbers, len, places);
}



int main()
{
    int numbers[] = { 1, 2, 3, 4 };
    const int numbersLength = 4;
    const int places = 3;

    rekPerm(0, numbers, numbersLength, places);



    return 0;
}
04/01/2012 18:29 ehauser#7
ok, danke für deine Mühe (falls du das selber geschrieben hast)!
04/01/2012 18:44 xNopex#8
Ja das habe ich selbst geschrieben, sonst wäre das kaum so unglaublich umständlich und wirr. Und dass es fehlerfrei ist, kann auch nicht garantiert werden. Hatte kein Blatt Papier zur Hand. Das ist mehr oder weniger in meinem Kopf entstanden, was btw. der totale brainfuck war.