Funktion



  • Hallo

    Du willst das Prinzip eines kaskadierten Zählwerkes umsetzen. Nur eben auf Basis von Buchstaben anstelle von Ziffern.

    bis bald
    akari



  • Geh mal ins Projekte-Unterforum und suche einen Thread namens 'Alphabetische Liste!'.



  • Ein anderes Stichwort wäre Permutation. Ein für "uneingewihte" recht komplizierter Algorythmus, der alle Möglichen Kombinationen auflistet.

    Stichwort Bruteforcer. Die benutzen beispielsweise das System.



  • Hallo

    Nein das dürfte keine Permutation sein. Bei einer Permutation würde man von "AAAB" nicht auf "AAAC" kommen, denn Permutationen verändern nur die Anordnung der Elemente, aber es kommen keine neuen (hier C) dazu oder verschwinden (hier 😎

    bis bald
    akari



  • hab da mal was zusammengefrickelt

    #include <iostream>
    
    void bla(std::string& m, int p) {
    	std::string mm="A";
    	if(p==-1) {
    		mm+=m;
    		m=mm;
    		return;
    	}
    	if(m[p]=='Z') {
    		bla(m, p-1);
    		m[p]='A'-1;
    	}
    	m[p]=(char)m[p]+1;
    }
    
    int main() {
    	std::string m = "A";
    	while(m.length()<5) {
    		std::cout<<m.c_str()<<"\n";
    		if(m[m.length()-1]=='Z') {
    			bla(m, m.length()-2);
    			m[m.length()-1]='A'-1;
    		}
    		m[m.length()-1]=(char)m[m.length()-1]+1;
    	}
    	return 0;
    }
    

    :xmas2: :xmas2: :xmas2: :xmas1:



  • Hier mal das ganze mit ein bisschen weniger gefrickel :xmas1:

    #include <iostream>
    int main(){
        std::string start(4,'A');
        std::string s = start;
        do{
            std::cout << s << "\n";
            for(int i = s.size()-1; i >= 0; --i){
                if(s[i] == 'Z'){
                    s[i] = 'A';
                }else{
                    s[i]++;
                    break;
                }
            }
        }while(s != start);
    }
    


  • kompliziert, kompliziert 🙄

    im prinzip ist das ganze ein zählwerk, das aufwärts zählt, von 0 bis 26*26*26*26-1. im prinzip braucht man also nur die darstellung dementsprechend anzupassen:

    for (int i = 0; i < 26*26*26*26; ++i)
    {
       cout << char('A'+i/(26*26*26)%26) << char('A'+i/(26*26)%26) << char('A'+i/26%26) << char('A'+i%26) << endl;
    }
    

    should do the trick 😉



  • probiers mal so:

    unsigned counter(char* s)
    {
         unsigned rv=1;
    
         if(*s != '\0' && (rv=counter(s+1)))
             if(*s < 'z')
             {
                 ++(*s);
                 rv=0;
             }
    
        return rv;
    }
    

    die funktion durchläuft den string erst bis ans ende (rekursion) und lässt sich dann wieder soweit "zurückfallen" bis ein wert noch nicht 'z' ist. dieses array-element wird dann erhöht und der rest unverändert zurückgegeben. wenn auch das vorderste element 'z' ist gibt dir die funktion eine 1 zurück, kannst dir also so alles ausgeben lassen:

    char s[]="aaaa";
    
    do
    {
         printf("%s\n", s);
    }while(!counter(s));
    

    ich hoffe du verzeihst mir dasses in C ist 😉



  • queer_boy schrieb:

    kompliziert, kompliziert 🙄

    im prinzip ist das ganze ein zählwerk, das aufwärts zählt, von 0 bis 26*26*26*26-1. im prinzip braucht man also nur die darstellung dementsprechend anzupassen:

    for (int i = 0; i < 26*26*26*26; ++i)
    {
       cout << char('A'+i/(26*26*26)%26) << char('A'+i/(26*26)%26) << char('A'+i/26%26) << char('A'+i%26) << endl;
    }
    

    should do the trick 😉

    dafür kann das komplizierte gefrickel auch mit ganz langen strings. optimized for quantencomputer die wo dann so schnell zählen können, dass man da hin kommt.



  • und es beginnt bei A und nicht bei AAAA, falls das überhaupt gewollt war.



  • Danke für die ganzen Antworten, aber wie kann ich das von queer_boy so
    umschreiben, dass n die Anzahl der Ziffer angibt???



  • na, das sieht man doch, wo man da eine schleife hin machen muss


Anmelden zum Antworten