Σκοπός του προγράμματος είναι να δώσει τα υποσύνολα που σχηματίζουν το άθροισμα Σκοπό, από ένα σύνολο αριθμών.
Είχα φτιάξει εδώ και πολύ καιρό την αρχική έκδοση του προγράμματος, που παρουσιάζω εδώ και την είχα στο Info ως Αθροισμα. Εδώ έχω κάνει βελτιώσεις. Με μια ταξινόμηση στην αρχική λίστα, με το μεγαλύτερο πρώτο τώρα πετυχαίνει όλους τους συνδυασμούς! Επίσης έβαλα και την περίπτωση να υπάρχει το άθροισμα - σκοπός - σε μια τιμή στη λίστα.
Η νέα έκδοση θα μπει στο Info της έκδοσης 12 αναθ. 38 που έχω ετοιμάσει (περιλαμβάνει τα #Αρχη() και #Τέλος() για να βάζουμε λίστες στην αρχή ή στο τέλος μιας λίστας. Πχ το (1,2,3)#Αρχή((0,))#Τέλ((4,5,6)) φτιάχνει το (0,1,2,3,4,5,6).
? (1,2,3)#Αρχή((0,))#Τέλ((4,5,6))#αθρ()=21
? Μήκος((1,2,3)#Αρχή((0,))#Τέλ((4,5,6)))=7
Το πρόγραμμα έχει βελτιωθεί με χρήση πιο γρήγορων δομών. Για παράδειγμα χρησιμοποιώ μια λίστα που είναι ένα Hash Table, για να μην βάζω ίδια υποσύνολα στη τελική λίστα υποσυνόλων. Στο παλιό πρόγραμμα γίνονταν σειριακή αναζήτηση σε έγγραφο κειμένου! Επίσης οι ταξινομήσεις γίνονται γρήγορα, γιατί η Λίστα αριθμών (μονοδιάστατος πίνακας) έχει εντολή για ταξινόμηση,
Τα αποτελέσματα γράφονται σε ένα αρχείο και αυτό προβάλεται στην οθόνη σε διορθωτή από όπου μπορούμε να αντιγράψουμε ότι θέλουμε!
Έχει μπει και τα Αναλυτής/ Τύπωσε Φόρτος που μετράει το χρόνο εκτέλεσης στον κώδικα που τρέχει μεταξύ τους!
Αποτελέσματα:
Σύνολο: 1, 1, 1, 3, 3, 3, 4, 1, 2, 5, 7
Σκοπός: 16
001. 2, 3, 4, 7
002. 1, 1, 1, 3, 3, 7
003. 2, 3, 3, 3, 5
004. 1, 1, 1, 1, 5, 7
005. 1, 1, 1, 1, 2, 3, 3, 4
006. 1, 1, 3, 4, 7
007. 4, 5, 7
008. 1, 1, 2, 3, 4, 5
009. 1, 3, 5, 7
010. 1, 1, 1, 1, 2, 3, 7
011. 1, 1, 3, 3, 3, 5
012. 1, 3, 3, 4, 5
013. 1, 1, 1, 2, 4, 7
014. 1, 2, 3, 3, 3, 4
015. 1, 2, 3, 3, 7
016. 1, 1, 2, 5, 7
Αδειασε
\\ ετοιμασία οθόνης
Οθόνη 5 : Φορμα 80,50 : Πένα 14
\\ ετοιμασία πίνακα
Πίνακας Α()
αν τυχαίος(1,2)=1 τότε
Α() = ( 1, 1, 1, 3, 3, 3, 4, 1, 2, 5, 7)
Μακρύς σκοπός=τυχαίος(1,3)*5+τυχαίος(1,3)-2
Αλλιώς
Α() =(1, 3, 4, 6, 5, 4,12, 13, 7,8, 20, 17)
Μακρύς σκοπός=τυχαίος(1,5)*5+τυχαίος(1,5)-3
τέλος αν
μεγ=Μήκος(Α())
μεγ1=μεγ-1
\\ μεταβλητές
Μακρύς συνολο, μισό=μεγ Δια 2
\\Ετοιμασία Εξαγωγής
Έγγραφο Α$={Αποτελέσματα:
Σύνολο: }+Α()#γραφη$(", ")+{
Σκοπός:}+γραφη$(Σκοπός)+{
}
\\ κύρια επανάληψη
Λογικός ενα_ακόμα
Λιστ1=Λίστα
Α()=Α()#ταξινόμηση(1) //#αναπ()
Αναλυτής
Για κ=0 Έως μεγ1
Αν α(κ)<σκοπός Τότε
Για τόσα=1 Έως μεγ1 \\ δοκίμασε με τόσα=2
πάρε_ένα(κ, σκοπός, τόσα)
Επόμενο
Αλλιώς.Αν α(κ)=σκοπός Τότε
ενα_ακόμα=Αληθές
Τέλος Αν
Επόμενο
Αν ενα_ακόμα τότε ΒάλεΤελευταίο()
Τύπωσε "Πάτα Esc"
Τύπωσε Φόρτος
Οθόνη, 2
Διόρθωσε Α$ \\ ανοίγει τον διορθωτή Για να συμπληρώσουμε κάτι
Πρόχειρο Α$ \\ εξαγωγή στο πρόχειρο
Σώσε.Έγγραφο Α$, "Αποτελέσματα.txt"
Αναφορά Α$ \\ στην οθόνη
Αν τμήμα(info) Τότε Τυπωσε "πάτα F3"
Ρουτίνα πάρε_ένα(χ, ν, άσε_τόσα)
Τοπικές κ=1, σουμα, κκ, μμ, Προχ$
μμ=χ
Σωρός Νέος {
Ενώ ν>0
χ=(μεγ+χ) Υπολ μεγ
Αν Α(χ)<=ν Τότε ν-=Α(χ):σουμα+=Α(χ):Βαλε Α(χ)
Αν κ+άσε_τόσα>=μεγ1 Τότε άσε_τόσα=1
κ+=άσε_τόσα
Αν κ>μεγ1 Τότε Έξοδος
χ=μμ+κ
Τέλος Ενώ
Αν σούμα=σκοπός Τότε
Αν όχι κενό Τότε
Προχ$=πίνακας([])#ταξινόμηση()#Γραφη$(", ")
Αν Δεν Υπάρχει(Λιστ1, Προχ$) Τότε
σύνολο++
Α$ =Γραφή$(σύνολο, "000")+". "+Προχ$+{
}
Προσθήκη Λιστ1, Προχ$
τέλος αν
τέλος αν
τέλος αν
}
Τέλος Ρουτίνας
Ρουτίνα ΒάλεΤελευταίο()
σύνολο++
Α$ =Γραφή$(σύνολο, "000")+". "+σκοπός+{
}
Τέλος Ρουτίνας
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.