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

Πρόγραμμα για συνδυασμούς


pagratios

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

Δημοσ.

Καλησπέρα σας,

 

πως μπορώ να κάνω ένα πρόγραμμα σε c ώστε να βάζει σε κάποιο αρχείο ή να τυπώνει με την σειρά συνδυασμούς?

 

Ας πούμε να έχω σε ενα αρχείο τα εξής

 

0000

0001

0002

...

...

0010

0011

...

...

00000

00001

...

...

 

 

Όπως παρατηρείται θέλω να αυξάνει και το μεγεθος του συνδυασμού. Δεν μπορώ να σκεφτώ πως μπορώ να αυξάνω το τελευταίο ψηφίο και μετά το αμέσως επόμενο για ενα και μόλις αυτό παρει την μέγιστη τιμή να το αυξανω το αμεσως επόμενο και συνέχεια μεχρι να πάει 9999 ωστε μετα να παει 00000

Δημοσ.

Με αριθμητική και 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);

Δημοσ.

Τόσο απλό ήταν?Εγώ νόμιζα θα ήταν τεράστιος ο κώδικας.

 

Άμα δεν θέλω μόνο νούμερα αλλά θέλω όλους τους ascii κωδκούς?

Δημοσ.
Τόσο απλό ήταν?Εγώ νόμιζα θα ήταν τεράστιος ο κώδικας.

 

Άμα δεν θέλω μόνο νούμερα αλλά θέλω όλους τους ascii κωδκούς?

 

Νούμερα είναι και αυτά

Δημοσ.
Τόσο απλό ήταν?Εγώ νόμιζα θα ήταν τεράστιος ο κώδικας.

 

Άμα δεν θέλω μόνο νούμερα αλλά θέλω όλους τους ascii κωδκούς?

 

Καταρχάς να βρεις πόσα διαφορετικά αποτελέσματα υπάρχουν πριν αρχίσουν να επαναλαμβάνονται. Χωρίς πολλά πολλά είναι το άθροισμα γεωμετρικής προόδου με λόγο προόδου λ = μέγεθος του αλφαριθμητικού συνόλου και αριθμό όρων ν = μέγεθος αποτελέσματος (το log10(TOP) στην προϊγούμενη περίπτωση). Βέβαια τυχένει να είναι επείσης ν = λ. Άρα 81872443.gif

Πολοί τρόποι υπάρχουν, ένας που ακολουθεί την φιλοσοφία αυτή είναι:

 

>
#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

Δημοσ.

Καλό φαίνεται. Θα το δοκιμάσω με διάφορες παραλλαγές ώστε να βγάλω ένα αρχείο με συνδιασμούς όλων των aascii κωδικών από τον 32-126

Δημοσ.
Καλό φαίνεται. Θα το δοκιμάσω με διάφορες παραλλαγές ώστε να βγάλω ένα αρχείο με συνδιασμούς όλων των aascii κωδικών από τον 32-126

 

Σε περίπτωση που δεν γνωρίζεις πόσοι συνδυασμοί είναι αυτοί...

 

 

Μιλάς για 77328262868220816885376026592316747760774495895645120097301868712298088825997701530295842889409571972763980252484087716642097600880660419985668542377430724742828018900175440184613491626495 συνδυασμούς.

 

δηλαδή με ένα υπολογιστή που θεωριτικά υπολογίζει 3 δις υπολογισμούς το δευτερόλεπτο, σε 7160024339650075637534817277066365533405045916263437046046469325212786002407194586138503971241627034515183356711489603392786814896357446294969309479391733772484075824090318535 χρόνια θα το έχεις υπολογίσει! (και όχι με το πρόγραμμα μου, δεν δουλεύει για τόσο μεγάλους αριθμούς)

 

 

Δημοσ.

Χαχαχα...Οκ σαν να εχεις δικιο και ναι δεν είχα υπολογίσει τι αριθμό θα μπορουσε να ειναι οποτε θα περιορίστω σε καποιους μονο

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

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

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