iterator Δημοσιεύτηκε Αύγουστος 5, 2007 #1 Κοινοποίηση Δημοσιεύτηκε Αύγουστος 5, 2007 Καλημέρα σε όλα τα παιδιά του forum.Θέλω να φτιάξω μία συνάρτηση που να σπάει έναν αριθμό σε κάποιους άλλους (οι οποίοι έχουν το ίδιο άθροισμα με τον πρώτο) με όλους τους πιθανούς συνδυασμούς με τις εξής ιδιότητες: Ο πρώτος αριθμός να είναι πάντα 1 και κάθε αριθμός στην ακολουθία να είναι μεγαλύτερος ή ίσος με τον προηγούμενο του.Δηλαδή αν η συνάρτηση έχει 2 παραμέτρους π.χ.method(10, 5) { . . . }πρέπει να φτιάχνει τους συνδυασμούς:111161112511134112241123312223Προσπάθησα αρκετά αλλά δεν κατάφερα κάτι. Αν έβρισκα μία μέθοδο που να φτιάχνει όλους τους συνδυασμούς ανεξαρτήτως των ιδιοτήτων που θέτω θα μπορούσα με κατάλληλους ελέγχους να απορρίψω αυτούς που δεν χρειάζομαι.Οπότε αν υπάρχει μια τέτοια μέθοδος θα ήταν σαν λύση στο πρόβλημα μου.Ευχαριστώ εκ των προτέρων όσους ασχοληθούν έστω και λίγο. Link to comment Share on other sites More sharing options...
DarkSaga Αύγουστος 5, 2007 #2 Κοινοποίηση Αύγουστος 5, 2007 αν δεν επιβάλεις πρώτα τους όρους που θέλεις η μερικούς απο αυτούς τουλάχιστονθα καταλήξεις σε πάρα πολύ αργό κώδικα με δεκάδες άκυρες λούπες. Link to comment Share on other sites More sharing options...
iterator Αύγουστος 5, 2007 Author #3 Κοινοποίηση Αύγουστος 5, 2007 Το γνωρίζω αυτό αλλά δε μπορώ να σκεφτώ κάτι καλύτερο από το να βρίσκει πρώτα όλους τους συνδυασμούς και μετά να ξεσκαρτάρω τους άχρηστους. Ευχαριστώ για την επισήμανση. Link to comment Share on other sites More sharing options...
effect Αύγουστος 5, 2007 #4 Κοινοποίηση Αύγουστος 5, 2007 Μια μέθοδος η οποία όμως θέλει βελτίωση ως προς τον τρόπο αποθήκευσης ειναιvoid Sindiasmoi(int Sum, int thesis){ int [] pin =new int[5];method(int Sum , int thesis ,int min,int[]pin){ if (thesis==2) { pin[thesis]=min; pin[thesis-1]=Sum-min; for (int i=pin.length()-1;i>=0;i--) { System.out.print(pin); } System.out.println; } else { pin[thesis]=min; for(int i=min;i<=(Sum-min)/(thesis-1);i++) { method(Sum-min,thesis-1,i); } }} Η μέθοδος είναι αναδρομική και έχεις τις εξής κλήσεις για method(10,5,1) που είναι το παράδειγμα που είχες.(10,5,1) καλεί (9,4,1) καλεί (8,3,1) καλεί (7,2,1) και πέρνεις τον 11116από την (8,3,1) καλεί (7,2,2) όπου βγαίνει 11125από την (8,3,1) καλεί (7,2,3) όπου βγαίνει 11134πίσω στην (9,4,1) καλεί (8,3,2) καλεί (6,2,2) βγαίνει 11224πίσω στην (8,3,2) καλεί (6,2,3) 11233πίσω στην (10,5,1) καλεί (9,4,2) καλεί (7,3,2) καλεί (5,2,2) βγαίνει 12223To πρόγραμμα αυτό εκτυπώνει τους συνδυασμούς. Αλλά το έγραψα σε Java εύκολα γίνεται C++ Link to comment Share on other sites More sharing options...
iterator Αύγουστος 5, 2007 Author #5 Κοινοποίηση Αύγουστος 5, 2007 Ευχαριστώ πολύ effect για τον κόπο σου. Το μετέτρεψα σε c++ αλλά παρόλο που κάνει compile πάω να το τρέξω και μου εξαφανίζεται αμέσως χωρίς να προλάβω να δω τίποτα(σ. έχω βάλει system("PAUSE"); ).Πάντως όπως το κοιτάω φαίνεται σωστό. Θα προσπαθήσω να βρω το λάθος μου. Link to comment Share on other sites More sharing options...
iterator Αύγουστος 6, 2007 Author #6 Κοινοποίηση Αύγουστος 6, 2007 Τελικά τα κατάφερα. Ευχαριστώ πολύ όσους ασχολήθηκαν και ιδιαίτερα τον effect που έδωσε τη λύση στο πρόβλημα μου.Ο κώδικας σε C++ (για να υπάρχει) :void method(int sum, int theseis, int min, int* pin, int diastima) { if(theseis==2) { pin[theseis-1]=min; pin[theseis-2]=sum-min; for(int i=diastima-1; i>=0; i--) { cout << pin[i] << " "; } cout << endl; } else { pin[theseis-1]=min; for(int i=min; i<=(sum-min)/(theseis-1); i++) { method(sum-min, theseis-1, i, pin, diastima); } }}void sindiasmoi(int sum, int theseis) { int* pin=new int[theseis]; int diastima=theseis; method(sum, theseis, 1, pin, diastima);}int main() { int diastima=5; int units=10; sindiasmoi(units, diastima); cout << endl; system("PAUSE"); return 0;} Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.