Jump to content

Μια μικρή βοήθεια σε C++ (Solved)


iterator
 Share

Recommended Posts

Καλημέρα σε όλα τα παιδιά του forum.

Θέλω να φτιάξω μία συνάρτηση που να σπάει έναν αριθμό σε κάποιους άλλους (οι οποίοι έχουν το ίδιο άθροισμα με τον πρώτο) με όλους τους πιθανούς συνδυασμούς με τις εξής ιδιότητες: Ο πρώτος αριθμός να είναι πάντα 1 και κάθε αριθμός στην ακολουθία να είναι μεγαλύτερος ή ίσος με τον προηγούμενο του.

Δηλαδή αν η συνάρτηση έχει 2 παραμέτρους π.χ.

method(10, 5) { . . . }

πρέπει να φτιάχνει τους συνδυασμούς:

11116

11125

11134

11224

11233

12223

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

Οπότε αν υπάρχει μια τέτοια μέθοδος θα ήταν σαν λύση στο πρόβλημα μου.

Ευχαριστώ εκ των προτέρων όσους ασχοληθούν έστω και λίγο.

Link to comment
Share on other sites

αν δεν επιβάλεις πρώτα τους όρους που θέλεις η μερικούς απο αυτούς τουλάχιστον

θα καταλήξεις σε πάρα πολύ αργό κώδικα με δεκάδες άκυρες λούπες.

Link to comment
Share on other sites

Το γνωρίζω αυτό αλλά δε μπορώ να σκεφτώ κάτι καλύτερο από το να βρίσκει πρώτα όλους τους συνδυασμούς και μετά να ξεσκαρτάρω τους άχρηστους. Ευχαριστώ για την επισήμανση.

Link to comment
Share on other sites

Μια μέθοδος η οποία όμως θέλει βελτίωση ως προς τον τρόπο αποθήκευσης ειναι

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) βγαίνει 12223

To πρόγραμμα αυτό εκτυπώνει τους συνδυασμούς. Αλλά το έγραψα σε Java εύκολα γίνεται C++

Link to comment
Share on other sites

Ευχαριστώ πολύ effect για τον κόπο σου.

Το μετέτρεψα σε c++ αλλά παρόλο που κάνει compile πάω να το τρέξω και μου εξαφανίζεται αμέσως χωρίς να προλάβω να δω τίποτα(σ. έχω βάλει system("PAUSE"); ).

Πάντως όπως το κοιτάω φαίνεται σωστό. Θα προσπαθήσω να βρω το λάθος μου.

Link to comment
Share on other sites

Τελικά τα κατάφερα. Ευχαριστώ πολύ όσους ασχολήθηκαν και ιδιαίτερα τον 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.