Προς το περιεχόμενο

posoi tropoi gia combinations generator (combinatronics/sindiastiki)?


Stilewag

Προτεινόμενες αναρτήσεις

Δημοσ.

Να κάποιες αλλαγές που το φέρνουν πιο κοντά σε αυτό που έχεις (και χωρίς τον περιορισμό του μήκους λέξης (υπάρχει το 10000 βέβαια στην 1η γραμμή βέβαια, αλλά και στο πρόγραμμα που έχεις υπάρχει αντίστοιχος περιορισμός). Το να βρεις τους συνδυασμούς είναι νομίζω απλό (μήκος αλφαβήτου υψωμένο στο μήκος λέξης) οπότε δεν το έβαλα μέσα):

 

#include <stdio.h>

int main(void)

{

const int max_chars_in_result = 1000;

char result[max_chars_in_result];

int wanted, alphabet_length, position_in_result = max_chars_in_result;

 

/* eisagwgn dedomevwv */

 

result[999] = 0; /* terminating null for string result */

 

printf("Alphabet length? ");

scanf("%d", &alphabet_length);

 

printf("Number of wanted combination? ");

scanf("%d", &wanted);

--wanted; /* 1o suvduasmos 8ewreitai o 1 (avti o 0) */

 

/* upologismos */

 

do {

result[--position_in_result] = 'a' + wanted % alphabet_length;

wanted /= alphabet_length;

} while (wanted > 0);

 

printf("%s\n", result + position_in_result);

}

  • Απαντ. 30
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

EPa, to deftero programa sou gia kapoio logo den kanei compile, den katalavainw ti ftaiei :-|

 

Sto proto programa, otan vazw 15 mou vgazei tin idia leksi pou mou vgazei o dikos mou algorithmos ston arithmo 16, pou simainei oti egw metraw apo to 1. Kai o kwdikas pou egrapses einai kata poly ligoteros apo afton pou egrapsa egw (eimai protaris).

 

Otan omws (sto diko sou proto programa) vazw tin topothesia "1" mou vgazei "a". Enw i diki mou ekdosi mou vgazei "aaa". Ti mou diafevgei?

 

Oso gia to paper, petakse! :) To paper den epikentronetai se afto, afto einai ena meros tou algorithmou. Kai mallon ital lathos pou to eipa "paper", dioti parapempei se doctora, kai tetoia. LOL :D mia apli ergasia einai. Tha edina efxaristws ton kwdika, alla gia kapoio logo fovamai mipws matheftei kai parw "0.000" stin ergasia :) Eksalou tha itan paralogo na pistevw pws egw, me elaxistes gnwseis porgramatismou (logiki) kai C tha mporousa na exw kati pou den skeftike kaneis allos.

 

Epeidi to thema mou kinise to endiaferon eksw apo tin ergasia, isws paratisw afto to thema ergasias wste na mporesw na doso ton kwdika kai na mathw pio efkola. Mono... min telika to kanw olo afto (dioti einai kali fasi afti i ergasia: endiaferousa kai sxetika efkoli) kai meta den apantaei kaneis :D

Δημοσ.

alaksa 1 pragmataki sto proto programa kai twra deixnei tin topothesia opws to diko mou .exe:

 

 

void main(void)

{

int AlphabetLength;

char Alphabet[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

char Result[1000];

int Location, Pos = 0;

 

printf("Alphabet length: ");

scanf("%d", &AlphabetLength);

printf("Number of wanted combination: ");

scanf("%d", &Location);

AlphabetLength = 26;

Location = 100;

Location--;

 

do

{

Result[Pos++] = Alphabet[Location % AlphabetLength];

Location = Location / AlphabetLength;

} while (Location>0);

 

do

{

printf("%c", Result[--Pos]);

} while (Pos>0);

 

printf("\n\n\n\n");

}

 

Sto deftero programa, apla alaksa to char result[1000]; kai twra trexei kanonika kai dinei apotelesma opws to panw.

 

Alla den mporw na katalavw pws tha to kanw na mou dinei leksi oso mikous thelw egw.

Δημοσ.
Otan omws (sto diko sou proto programa) vazw tin topothesia "1" mou vgazei "a". Enw i diki mou ekdosi mou vgazei "aaa". Ti mou diafevgei?

 

Το δικό μου σου δίνει τα ελάχιστα "ψηφία" που χρειάζεσαι και όλα τα άλλα εννοούνται 0. Στην περίπτωση του αλφάβητου που χρησιμοποιούμε το 'a' αντιστοιχεί στο 0. Και επίσης ο συνδυασμός 1 είναι η λέξη a. Δηλαδή το a είναι το ίδιο με το aa και το aaa και το aaaa και πάει λέγοντας, με τον ίδιο τρόπο που το 0 είναι ίδιο με το 00 και το 000 και πάει λέγοντας.

Το dee στο παραπάνω παράδειγμα θα ήταν adee αν ζητούσες λέξεις με 4 γράμματα, aadee με 5, aaadee με 6 και πάει λέγοντας.

Όπως ο αριθμός πχ. 756 είναι ο ίδιος με τον 0756 και με τον 00000000756.

 

Για τα υπόλοιπα θα επανέλθω αύριο, είναι λίγο αργά... :-)

Δημοσ.
EPa' date=' to deftero programa sou gia kapoio logo den kanei compile, den katalavainw ti ftaiei :-|

[/quote']

 

Μόλις το ξαναέλεγξα και κάνει compile κανονικά σε unix gcc και σε borland c++ command line tools σε pc. Ποιο είναι το 1ο λάθος που αναφέρει ο compiler σου (και ποιος σε τι πλατφόρμα είναι; )

Δημοσ.

Να επαναλάβω ότι το πρόβλημα που περιγράφεις δεν έχει καμία σχέση με συνδυαστική κτλ, είναι το κλασσικό πρόβλημα μετατροπής από δεκαδικό σύστημα σε σύστημα άλλης βάσης. Απλά αντί να χρησιμοποιείς τα συνηθισμένα ψηφία (0, 1, 2, ...) ορίζεις το δικό σου αλφάβητο, και γι' αυτό χρειάζεται ο πίνακας alphabet. Κατά τα άλλα δεν έχει καμία διαφορά.

 

Νομίζω θα σε βοηθούσε πολύ αν δοκίμαζες να μετατρέψεις με το χέρι μερικούς δεκαδικούς αριθμούς στο οχταδικό, δεκαεξαδικό, πενταδικό κτλ σύστημα. Κάνοντας δηλαδή διαδοχικές διαιρέσεις με την βάση του συστήματος και αντιστρέφοντας τα υπόλοιπα.

 

Πάρε και την δική μου έκδοση του προγράμματος, βάζει και τα μηδενικά στην αρχή:

>#include <stdio.h>
#include <string.h>

#define WORD_LENGTH 4
#define ALPHABET_LENGTH 16

int main(void)
{
 char alphabet[ALPHABET_LENGTH] = "0123456789ABCDEF";  //edw bazeis to albabnto
 char result[WORD_LENGTH + 1];                      //edw kratame to apotelesma
 long long k = 1000;                                   //edw bazeis to location
 int i = WORD_LENGTH;            //bon8ntikos metrntns, index gia to apotelesma

 memset(result, alphabet[0], WORD_LENGTH);            //arxikopoinsn tou result
 result[WORD_LENGTH] = '\0';

 while (k != 0) {          //metatropn ari8mou se diaforetiko sustnma metrnsews
   result[--i] = alphabet[k % ALPHABET_LENGTH];
   k = k / ALPHABET_LENGTH;   //me diadoxikes diaireseis me tnv kaivourgia basn
 }

 printf("To apotelesma eivai: %s\n", result);

 return 0;
}

Δημοσ.

Υ.Γ. στο

>
printf("Alphabet length: ");
scanf("%d", &AlphabetLength);
printf("Number of wanted combination: ");
scanf("%d", &Location);
AlphabetLength = 26;
Location = 100;

που έγραψες στο post παραπάνω:

 

δεν έχει νόημα ΚΑΙ να διαβάζεις έναν αριθμό από το πληκτρολόγιο ΚΑΙ να του αναθέτεις τιμή στη συνέχεια...

Δημοσ.

nai eimai ligo aprosektos.

 

xrisimopoiw Borland C++ 2.0 (DOS, 1992)

 

---

 

tha meletisw ta kainouria pragmata pou mou grapsate.

 

an omows exw alfavito 96 xaraktirwn me leksi 50 xaraktirwn vgainei 96^50. An twra ipothesoume pws prepei na vrw (me ton programa pou mou dosate) tin proteleftaia leksi, pws tha mporesw na doso stin C tin topothesia pou thelw na mou pei tin leksi? (ef'oson den mporw na exw toso megalous arithmous)?

 

---

 

kanena kalo vivlio gia c?

 

na mathw prota c kai meta c++? nomizw oti etsi einai kalytera alla eseis ti lete?

Δημοσ.
an omows exw alfavito 96 xaraktirwn me leksi 50 xaraktirwn vgainei 96^50. An twra ipothesoume pws prepei na vrw (me ton programa pou mou dosate) tin proteleftaia leksi, pws tha mporesw na doso stin C tin topothesia pou thelw na mou pei tin leksi? (ef'oson den mporw na exw toso megalous arithmous)?

 

Δεν μπορείς να ζητήσεις την 96^50 - 1 θέση με 32 ή 64 bit ακέραιο. Δεν μπορείς καν να διαβάσεις αυτή τη θέση (σαν ακέραιο) από το πληκτρολόγιο. Ή θα πρέπει να χρησιμοποιήσεις βιβλιοθήκες για αριθμούς μεγάλου μεγέθους, ή να κάνεις μια δικιά σου εξομοίωση, όπου θα χρησιμοποιείς έναν ολόκληρο ακέραιο για κάθε χαρακτήρα (επομένως θα δέχεσαι αλφάβητο μέχρι 2^64 στοιχεία), και να έχεις πίνακα ακεραίων για να κρατάει τον μετρητή και τον τελικό αριθμό.

 

...αν χρειάζεσαι οπωσδήποτε τέτοια μεγέθη, πιο εύκολο θα είναι με βιβλιοθήκη...

http://www.swox.com/gmp

Δημοσ.
an omows exw alfavito 96 xaraktirwn me leksi 50 xaraktirwn vgainei 96^50. An twra ipothesoume pws prepei na vrw (me ton programa pou mou dosate) tin proteleftaia leksi, pws tha mporesw na doso stin C tin topothesia pou thelw na mou pei tin leksi? (ef'oson den mporw na exw toso megalous arithmous)?

 

Η προτελευταία λέξη είναι εύκολη :-) :

 

είναι μια σειρά από 50 σύμβολα, όπου τα πρώτα 49 είναι το τελευταίο σύμβολο του αλφαβήτου σου, και το 50στό το προτελευταίο. ;-)

Δημοσ.
Η προτελευταία λέξη είναι εύκολη :-) :

 

είναι μια σειρά από 50 σύμβολα' date=' όπου τα πρώτα 49 είναι το τελευταίο σύμβολο του αλφαβήτου σου, και το 50στό το προτελευταίο. ;-)[/quote']

 

nai ontws esti einai :) to xrisimopoiisa san paradeigma gia na rotisw pws tha mporesw na vrethw se mia tyxaia thesi

 

telika den tin glitwnw, prepei na xrisimopoiisw kati san tin GMP. Tin eida kai sto allo thread kai tin katevasa kai psaxnw mipws "ksetriposo" to komati tou kwdika pou einai ipefthino gia tous very long int. Diavazw kai ena arthro (to opoio einai distixws sta agglika) kai prospathw na katalavw ti kanou (enwwntas apo mathimatika) aftes oi vivliothikes.

 

Ligo maniki gia mena pou eimai protatis. Ligo... :)

Δημοσ.

Paidia, efxaristw gia tin ipostiriksi. Ageneia pou den to eipa pio mprosta. Kathe ena post se afto to thread me voithise. Dixws afta pou mou eipate tha mpousoulaga sto skotadi. Telika den tha kanw tin ergasia an kai tha mporousa.

 

Mono kati telefaio: aftos einai o monos tropos metatropis apo to ena sistima sto allo? (nai kserw, stin arxi to elega combinatronics, alla den einai :) )

Δημοσ.

Γενικά ναι, πρέπει να χρησιμοποιείς διαιρέσεις με την καινούργια βάση.

 

Σε ειδικές περιπτώσεις μπορούν να εφαρμοστούν κάποια κολπάκια, επειδή η διαίρεση είναι χρονοβόρα στους Η/Υ. Για παράδειγμα φαντάσου ότι θες να μετατρέψεις έναν αριθμό από την δυαδική αναπαράσταση που έχει στον Η/Υ σε δεκαεξαδικό, π.χ. 3F5A.

 

Ομαδοποιώντας ανά 4 τα δυαδικά ψηφία είναι σαν να διαιρείς με το 16, οπότε η "διαίρεση" γίνεται πολύ πιο γρήγορα με εντολές του στυλ

 

number & 0xF; //απομόνωσε τα τέσσερα δεξιότερα δυαδικά ψηφία

(number >> 4) & 0xF //απομόνωσε τα τέσσερα επόμενα δυαδικά ψηφία

 

Τέλος, πάλι σε ειδικές περιπτώσεις, μπορείς να εφαρμόσεις και lookup tables, κάτι σαν το αλφάβητο που λέγαμε. Π.χ. το lookup table για τους διψήφιους δεκεξαδικούς θα μπορούσε να είναι

char *table[] = {'00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0A', '0B', '0C', '0D', '0E', '0F', '10', '11', ...} όπου βάζοντας εσύ σαν index τον αριθμό να παίρνεις αμέσως την αντίστοιχη δεκαεξαδική του αναπαράσταση.

 

edit: Να επισημάνω όμως ότι εσύ θέλεις ΜΟΝΟ 50 διαιρέσεις (αφού η λέξη σου έχει μέγεθος 50), οι οποίες γίνονται σε ελάχιστα msec...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...