Jump to content


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


iterator

Recommended Posts

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

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

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

method(10, 5) { . . . }

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

11116

11125

11134

11224

11233

12223

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

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

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

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

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.