pagratios Δημοσ. 9 Μαΐου 2010 Δημοσ. 9 Μαΐου 2010 Καλησπέρα σας, πως μπορώ να κάνω ένα πρόγραμμα σε c ώστε να βάζει σε κάποιο αρχείο ή να τυπώνει με την σειρά συνδυασμούς? Ας πούμε να έχω σε ενα αρχείο τα εξής 0000 0001 0002 ... ... 0010 0011 ... ... 00000 00001 ... ... Όπως παρατηρείται θέλω να αυξάνει και το μεγεθος του συνδυασμού. Δεν μπορώ να σκεφτώ πως μπορώ να αυξάνω το τελευταίο ψηφίο και μετά το αμέσως επόμενο για ενα και μόλις αυτό παρει την μέγιστη τιμή να το αυξανω το αμεσως επόμενο και συνέχεια μεχρι να πάει 9999 ωστε μετα να παει 00000
C6WGMN Δημοσ. 9 Μαΐου 2010 Δημοσ. 9 Μαΐου 2010 Με αριθμητική και printf > unsigned i; for(i = 0; i < UINT_MAX; i++) printf("%04u\n", i % 10000); ποιό γενική λύση: > #define TOP 10000 unsigned i; for(i = 0; i < UINT_MAX; i++) printf("%0*u\n", log10(TOP), i % TOP);
pagratios Δημοσ. 9 Μαΐου 2010 Μέλος Δημοσ. 9 Μαΐου 2010 Τόσο απλό ήταν?Εγώ νόμιζα θα ήταν τεράστιος ο κώδικας. Άμα δεν θέλω μόνο νούμερα αλλά θέλω όλους τους ascii κωδκούς?
ippo00 Δημοσ. 9 Μαΐου 2010 Δημοσ. 9 Μαΐου 2010 Τόσο απλό ήταν?Εγώ νόμιζα θα ήταν τεράστιος ο κώδικας. Άμα δεν θέλω μόνο νούμερα αλλά θέλω όλους τους ascii κωδκούς? Νούμερα είναι και αυτά
C6WGMN Δημοσ. 9 Μαΐου 2010 Δημοσ. 9 Μαΐου 2010 Τόσο απλό ήταν?Εγώ νόμιζα θα ήταν τεράστιος ο κώδικας. Άμα δεν θέλω μόνο νούμερα αλλά θέλω όλους τους ascii κωδκούς? Καταρχάς να βρεις πόσα διαφορετικά αποτελέσματα υπάρχουν πριν αρχίσουν να επαναλαμβάνονται. Χωρίς πολλά πολλά είναι το άθροισμα γεωμετρικής προόδου με λόγο προόδου λ = μέγεθος του αλφαριθμητικού συνόλου και αριθμό όρων ν = μέγεθος αποτελέσματος (το log10(TOP) στην προϊγούμενη περίπτωση). Βέβαια τυχένει να είναι επείσης ν = λ. Άρα Πολοί τρόποι υπάρχουν, ένας που ακολουθεί την φιλοσοφία αυτή είναι: > #include <stdio.h> #include <string.h> #include <math.h> /* -lm */ void f(char *tmp, unsigned x, unsigned y, unsigned k, const char *set) { unsigned i; *tmp++ = set[x % k]; for(i = 1; i < y; i++) { k = pow(k, i); *tmp++ = set[(x / k) % k]; } } int main(void) { const char set[] = "abc"; char tmp[4] = {0}; unsigned i = 0, k = strlen(set), j, x; for(i = 1; i <= k; i++) for(j = 0, x = pow(k, i); j < x; j++) { f(tmp, j, i, k, set); puts(tmp); } return 0; } Ο κώδικας είναι "σκατογραμμένος" με την έννοια ότι τον έγραψα σε μιά στιγμή έξαψης στο 30+ βαθμών κελσίου δωμάτιο μου. Η ιδέα είναι ότι αντιστοιχώ κάθε αριθμό j σε ένα permutation. Η έξοδος είναι > a b c aa ba ca ab bb cb ac bc cc aaa baa caa aba bba cba aca bca cca aab bab cab abb bbb cbb acb bcb ccb aac bac cac abc bbc cbc acc bcc ccc
pagratios Δημοσ. 9 Μαΐου 2010 Μέλος Δημοσ. 9 Μαΐου 2010 Καλό φαίνεται. Θα το δοκιμάσω με διάφορες παραλλαγές ώστε να βγάλω ένα αρχείο με συνδιασμούς όλων των aascii κωδικών από τον 32-126
C6WGMN Δημοσ. 9 Μαΐου 2010 Δημοσ. 9 Μαΐου 2010 Καλό φαίνεται. Θα το δοκιμάσω με διάφορες παραλλαγές ώστε να βγάλω ένα αρχείο με συνδιασμούς όλων των aascii κωδικών από τον 32-126 Σε περίπτωση που δεν γνωρίζεις πόσοι συνδυασμοί είναι αυτοί... Μιλάς για 77328262868220816885376026592316747760774495895645120097301868712298088825997701530295842889409571972763980252484087716642097600880660419985668542377430724742828018900175440184613491626495 συνδυασμούς. δηλαδή με ένα υπολογιστή που θεωριτικά υπολογίζει 3 δις υπολογισμούς το δευτερόλεπτο, σε 7160024339650075637534817277066365533405045916263437046046469325212786002407194586138503971241627034515183356711489603392786814896357446294969309479391733772484075824090318535 χρόνια θα το έχεις υπολογίσει! (και όχι με το πρόγραμμα μου, δεν δουλεύει για τόσο μεγάλους αριθμούς)
pagratios Δημοσ. 9 Μαΐου 2010 Μέλος Δημοσ. 9 Μαΐου 2010 Χαχαχα...Οκ σαν να εχεις δικιο και ναι δεν είχα υπολογίσει τι αριθμό θα μπορουσε να ειναι οποτε θα περιορίστω σε καποιους μονο
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.