Aus Buchstaben Vorgabe (abcd) alle möglichen Keys berechnen.
-
#include <windows.h> #include <iostream> #include <math.h> using namespace std; int main(int argc, char* argv[]) { char *str = new char[101]; char *digits = new char[36]; char *tmp = new char[60]; unsigned int digitcount = 0; ZeroMemory(str,101); ZeroMemory(digits,26); ZeroMemory(tmp,60); cin.getline(str,100,'\n'); //Jedes Zeichen des Strings durchlaufen und überprüfen, ob bereits vorhanden for (size_t i=0;i<strlen(str);i++) { //Alle vorhanden Zeichen durchsuchen bool bZeichenvorhanden = false; for (unsigned int j=0;j<digitcount;j++) { if (str[i]==digits[j]) { bZeichenvorhanden = true; } } //Zeichen nocht nicht vorhanden > hinzufügen if (!bZeichenvorhanden) { digits[digitcount++] = str[i]; } } if (digitcount > 8) { cout << "Zu viele Kombinationen" << endl; return 0; } cout << "Enthaltene Zeichen:" << digits << endl; int combinations = (int)pow((int)digitcount,(int)digitcount); char **result = new char*[combinations]; for (int i=0;i<combinations;i++) { result[i] = new char[digitcount+1]; ZeroMemory(result[i],digitcount+1); //In String unter Nutzung des vorhandenen Ziffernvorrats umwandeln itoa(i,tmp,digitcount); size_t len = strlen(tmp); if (len<digitcount) { //Führende Nullen anhängen FillMemory(result[i],digitcount-len,'0'); } //In Zielarray kopieren strcpy(result[i]+(digitcount-len),tmp); for (int j=0;j<digitcount;j++) { //Ziffern durch Zeichen des Zeichenvorrats ersetzen result[i][j] = digits[result[i][j]-48]; } } for (int i=0;i<combinations;i++) { cout << result[i] << " : "; } delete[] tmp; delete[] str; delete[] digits; return 0; }
Ich bitte um Verzeihung bezüglich der Nutzung von ZeroMemory, etc
-
Ein rekursiver Algorithmus findet sich unter:
-
[cpp]#include <string>
#include <iostream>
#include <algorithm>int main()
{
std::string str = "abcd";
while(std::next_permutation(str.begin(), str.end()))
{
std::cout << str << std::endl;
}
}[/cpp]
-
ssm schrieb:
[cpp]#include <string>
#include <iostream>
#include <algorithm>int main()
{
std::string str = "abcd";
while(std::next_permutation(str.begin(), str.end()))
{
std::cout << str << std::endl;
}
}[/cpp]Erstens unterschlägt der Code die erste Permutation und zweitens ist hier gar nicht nach den Permutationen gefragt worden.
-
Ponto schrieb:
Erstens unterschlägt der Code die erste Permutation
richtig
Ponto schrieb:
zweitens ist hier gar nicht nach den Permutationen gefragt worden.
-
Na sowas, ich denke mal, ich war mit meiner Lösung etwas verplant
Werde ich mich eben zurück in mein Loch verkriechen
-
Ich hätte noch was zu meiner wagen Idee oben. Allerdings "nur" C, funktioniert aber:
#include<stdlib.h> #include<stdio.h> int main() { char *eingabe = new char[20]; int *digits, i, laenge; printf("Ursprungs-Key:"); scanf("%s",eingabe); laenge = strlen(eingabe); digits = new int[laenge+1]; for(i=0; i<=laenge; i++) { digits[i] = 0; } do { printf("\n"); for(i=0; i<laenge; i++) { printf("%c", eingabe[digits[i]]); } digits[0]++; for(i=0; i<laenge; i++) { if(digits[i]>=laenge) { digits[i] = 0; digits[i+1]++; } } } while(digits[laenge] == 0); printf("\n"); delete digits; delete eingabe; return(0); }
-
Seit wann gibt es in C new und delete?
-
Okay, sorry. Halt so n Mischmasch-Zeug. Musste schnell gehen :p
-
So geht es schneller.
Die function hab ich von dem Link.#include <string> #include <iostream> using namespace std; void k(std::string const & f, std::string const & result, int len) { if (len == 0) { std::cout << result << std::endl; return; } std::string temp = result + " "; for (std::string::size_type i = 0; i != f.size(); ++i) { temp[temp.size()-1] = f[i]; k(f, temp, len-1); } } int main(){ string eingabe,tmp; cin>>eingabe; int a=eingeb.size(); k(eingabe,tmp,a); return 1; }
-
die std:: kannst du in void k weglassen
und in der sig bitte nur BBCode kein HTML verwenden ^^