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:

    http://www.c-plusplus.net/forum/viewtopic.php?t=84995



  • [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 ^^


Anmelden zum Antworten