EPa Δημοσ. 31 Μαρτίου 2005 Δημοσ. 31 Μαρτίου 2005 Να κάποιες αλλαγές που το φέρνουν πιο κοντά σε αυτό που έχεις (και χωρίς τον περιορισμό του μήκους λέξης (υπάρχει το 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); }
Stilewag Δημοσ. 31 Μαρτίου 2005 Μέλος Δημοσ. 31 Μαρτίου 2005 Δεν υπάρχει λάθος. heh nai, enww pou ekana to lathos. to koitaw... please wait, loading...
Stilewag Δημοσ. 31 Μαρτίου 2005 Μέλος Δημοσ. 31 Μαρτίου 2005 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 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
Stilewag Δημοσ. 31 Μαρτίου 2005 Μέλος Δημοσ. 31 Μαρτίου 2005 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.
EPa Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 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 Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 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 σου (και ποιος σε τι πλατφόρμα είναι; )
alkisg Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 Να επαναλάβω ότι το πρόβλημα που περιγράφεις δεν έχει καμία σχέση με συνδυαστική κτλ, είναι το κλασσικό πρόβλημα μετατροπής από δεκαδικό σύστημα σε σύστημα άλλης βάσης. Απλά αντί να χρησιμοποιείς τα συνηθισμένα ψηφία (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; }
alkisg Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 Υ.Γ. στο > printf("Alphabet length: "); scanf("%d", &AlphabetLength); printf("Number of wanted combination: "); scanf("%d", &Location); AlphabetLength = 26; Location = 100; που έγραψες στο post παραπάνω: δεν έχει νόημα ΚΑΙ να διαβάζεις έναν αριθμό από το πληκτρολόγιο ΚΑΙ να του αναθέτεις τιμή στη συνέχεια...
Stilewag Δημοσ. 1 Απριλίου 2005 Μέλος Δημοσ. 1 Απριλίου 2005 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?
alkisg Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 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
EPa Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 na mathw prota c kai meta c++? nomizw oti etsi einai kalytera alla eseis ti lete? Μάθε κατ' ευθείαν C++.
EPa Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 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στό το προτελευταίο. ;-)
Stilewag Δημοσ. 2 Απριλίου 2005 Μέλος Δημοσ. 2 Απριλίου 2005 Η προτελευταία λέξη είναι εύκολη : είναι μια σειρά από 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...
Stilewag Δημοσ. 6 Απριλίου 2005 Μέλος Δημοσ. 6 Απριλίου 2005 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 )
alkisg Δημοσ. 6 Απριλίου 2005 Δημοσ. 6 Απριλίου 2005 Γενικά ναι, πρέπει να χρησιμοποιείς διαιρέσεις με την καινούργια βάση. Σε ειδικές περιπτώσεις μπορούν να εφαρμοστούν κάποια κολπάκια, επειδή η διαίρεση είναι χρονοβόρα στους Η/Υ. Για παράδειγμα φαντάσου ότι θες να μετατρέψεις έναν αριθμό από την δυαδική αναπαράσταση που έχει στον Η/Υ σε δεκαεξαδικό, π.χ. 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...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.