ΠΡΟΓΡΑΜΜΑ ΦΙΛΟΙ_ΑΡΙΘΜΟΙ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Σ1, Σ2, Χ1, ΜΙΚ, ΜΕΓ, Ι
ΑΡΧΗ
ΓΡΑΨΕ 'Πάλι στους Πυθαγόρειους οφείλονται και οι φίλοι αριθμοί.'
ΓΡΑΨΕ 'Δυο αριθμοί λέγονται φίλοι αν ο καθένας ισούται'
ΓΡΑΨΕ 'με το άθροισμα των γνήσιων διαιρετών του άλλου.'
ΓΡΑΨΕ '---------------------------------------------------------'
ΓΡΑΨΕ 'Παρακαλώ δώστε τον αριθμό από τον οποίο θα αρχίσει να ψάχνει το πρόγραμμα.'
ΔΙΑΒΑΣΕ ΜΙΚ
ΓΡΑΨΕ 'Παρακαλώ δώστε τον αριθμό στον οποίο θα σταματήσει το πρόγραμμα.'
ΔΙΑΒΑΣΕ ΜΕΓ
ΑΝ ΜΕΓ<=ΜΙΚ Ή ΜΙΚ < 0 ΤΟΤΕ
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ 'Οι αριθμοί πρέπει να είναι μη αρνητικοί και ο 1ος μικρότερος από τον 2ο. παρακαλώ ξανα δώστε τους αριθμούς.'
ΔΙΑΒΑΣΕ ΜΙΚ
ΔΙΑΒΑΣΕ ΜΕΓ
ΜΕΧΡΙΣ_ΟΤΟΥ ΜΙΚ < ΜΕΓ ΚΑΙ ΜΙΚ >= 0
ΤΕΛΟΣ_ΑΝ
Υποθέτω ότι δεν υπάρχει κάποια απορία για τα παραπάνω άρα αρχίζω από εδώ αφού εξηγήσω της μεταβλητές.
Σ1: κρατάει το άθροισμα των διαιρετών του αριθμού που εξετάζουμε
Σ2:κρατάει το άθροισμα των διαιρετών του αριθμού που ελέγχουμε 2ο
Χ1: ο αριθμός που εξετάζετε
ΜΙΚ: ο αριθμός από τον οποίο θα αρχίσουμε να ψάχνουμε ζευγάρια φίλων αριθμών
ΜΕΓ: ο τελευταίος (και μεγαλύτερος) αριθμός που θα εξεταστεί
Ι: τιμή που χρησιμοποιείτε σαν μετρητής στις επαναλήψεις
Σε αυτό παίρνουμε έναν-έναν τους αριθμούς που είναι στα όρια που έχει δώσει ο χρήστης.
Οι φίλοι αριθμοί πάνε σε ζευγάρια (των 2). Και κάθε αριθμός έχει μόνο έναν φίλο (αν έχει). Άρα βρίσκουμε το άθροισμα των διαιρετών (χωρίς τον ίδιο τον αριθμό) του αριθμού.
Σ1 <-- 1
Σ2 <-- 1
ΓΙΑ Ι ΑΠΟ 2 ΜΕΧΡΙ Α_Μ(Τ_Ρ(Χ1))
ΑΝ Χ1 MOD Ι = 0 ΤΟΤΕ
Σ1 <-- Σ1+Ι+(Χ1 DIV Ι)
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Η επανάληψη αρχίζει από το 2 γιατί κάθε φορά που εκτελείται και βρίσκει έναν διαιρέτη προσθέτει τον διαιρέτη και τον αριθμό με τον οποίο αν πολλαπλασιάσουμε τον διαιρέτη μας δίνει τον Χ1, άμα άρχιζε από το 1 η επανάληψη θα πρόσθετε στο Σ1 και τον αριθμό και την μονάδα. Για αυτό και για να μην χαθεί το 1 που είναι διαιρέτης του, αρχίζει με την τιμή 1 το Σ1 και όχι με 0. Η επανάληψη τελειώνει στο Α_Μ(Τ_Ρ(Χ1)) επειδή:
α΄) Α_Μ , γιατί η Τ_Ρ μπορεί να επιστρέψει δεκαδική τιμή και το Ι είναι ακέραιο.
β΄) Τ_Ρ επειδή άμα βρούμε τους διαιρέτες μέχρι την τετραγωνική ρίζα ενός αριθμού μαζί με τους αριθμούς που χρειάζεται για να βγει γινόμενο ο αριθμός έχουμε βρει όλους τους διαιρέτες.
γ΄) το Χ1 επειδή κάθε διαιρέτης ενός αριθμού είναι μικρότερος από τον αριθμό
το Σ2 παίρνει την τιμή 1 για το παρακάτω.
Αυτό μπαίνει για να μην βρίσκει το ίδιο ζεύγος 2η φορά. Ίδια αποτελέσματα θα είχε το ΑΝ Σ1 <Χ1 ΤΟΤΕ το σ1=χ1 σημαίνει ότι ο αριθμός είναι τέλειος αλλά δεν μας ενδιαφέρει σε αυτό. Επίσης αν σ1=χ1 τότε θα έβρισκε τον εαυτό του ως φίλο του.
ένας αριθμός μπορεί να έχει μόνο έναν φίλο αφού το άθροισμα των ψηφίων του είναι μόνο 1
παρακάτω ελέγχει αν ο αριθμός που ισούται με το άθροισμα των ψηφίων του Χ1 έχει άθροισμα ψηφίων (πάντα χωρίς τον ίδιο τον αριθμό) ίσο με Χ1
Ι <-- 1
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
Ι <-- Ι + 1
ΑΝ Σ1 MOD Ι = 0 ΤΟΤΕ
Σ2 <-- Σ2 + Ι + (Σ1 DIV Ι)
ΤΕΛΟΣ_ΑΝ
ΜΕΧΡΙΣ_ΟΤΟΥ Σ2>Χ1 Ή Α_Μ(Τ_Ρ(Χ1))=Ι Ή Ι>Χ1 !ΑΥΤΟ ΤΟ ΕΒΑΛΑ ΓΙΑΤΙ ΓΙΑ ΑΡΙΘΜΟΥΣ ΟΠΩΣ ΤΟ 0
(εδώ άλλαξα το Σ1 σε Χ1 εκεί που λέει Σ2>Χ1)
Η επανάληψη πρέπει να σταματάει στις εξής περιπτώσεις:
i. Το άθροισμα των διαιρετών του 2ου αριθμού είναι μεγαλύτερο από τον πρώτο αριθμό. Δεν υπάρχει περίπτωση να μειωθεί.
ii. Έχει βρει όλους τους διαιρέτες
iii. Το Ι είναι μεγαλύτερο του Χ1 κάτι που συμβαίνει στις περιπτώσεις που το Χ1 είναι μικρό όπως 0 ή 1
ΑΝ Χ1=Σ2 ΚΑΙ Σ1 <= ΜΕΓ ΚΑΙ Σ1 >= ΜΙΚ ΤΟΤΕ !ΚΑΙ ΤΟ 1 ΠΡΟΣΠΕΡΝΑΕΙ ΚΑΤΕΥΘΕΙΑΝ ΤΗΝ ΤΙΜΗ ΤΟΥΣ ΤΟ Ι (ΑΡΧΙΖΕΙ ΑΠΟ ΤΟ 2)
ΓΡΑΨΕ 'ΟΙ ΑΡΙΘΜΟΙ', Χ1, Σ1, 'ΕΙΝΑΙ ΦΙΛΟΙ.'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Τέλος ελέγχει αν το άθροισμα των διαιρετών και του 2ου αριθμού είναι ίσα με τον 1ο (το αντίστροφο δεν χρειάζεται έλεγχο γιατί ο αριθμός έχει επιλεχτεί σύμφωνα με το άθροισμα των διαιρετών του 1ου )και αν ο αριθμός είναι μέσα στα όρια που έχει θέσει ο χρήστης. (αν το ΚΑΙ Σ1 <= ΜΕΓ ΚΑΙ Σ1 >= ΜΙΚ αφαιρεθεί θα επιστρέφει το ζεύγος και ας είναι ο 2ος εκτός ορίων).
Α και κάτι που παραλίγο να ξεχάσω, αυτό για λίγο ακόμη πιο γρήγορα, άλλαξα το ΑΝ Σ1 > Χ1 ΤΟΤΕ σε ΑΝ Σ1 > Χ1 ΚΑΙ Σ1 <= ΜΕΓ ΚΑΙ Σ1 >= ΜΙΚ ΤΟΤΕ και το ΑΝ Χ1=Σ2 ΚΑΙ Σ2 <= ΜΕΓ ΚΑΙ Σ2 >= ΜΙΚ ΤΟΤΕ σε ΑΝ Χ1=Σ2 ΚΑΙ Σ1 <= ΜΕΓ ΚΑΙ Σ1 >= ΜΙΚ ΤΟΤΕ το οποίο αλλάζει αφού ελέγχονται παραπάνω η 2η και η 3η συνθήκη χωρις να αλλάζουν μετά σε ΑΝ Χ1=Σ2 ΤΟΤΕ. Το ΚΑΙ Σ1 <= ΜΕΓ ΚΑΙ Σ1 >= ΜΙΚ στο ΑΝ Σ1 > Χ1 ΚΑΙ Σ1 <= ΜΕΓ ΚΑΙ Σ1 >= ΜΙΚ ΤΟΤΕ αν αφαιρεθεί θα δίνει το ζεύγος όπου και αν είναι ο 2ος αριθμός.
Ακολουθεί το πρόγραμμα με τις αλλαγές που έκανα(ΑΝ Σ1 > Χ1 ΤΟΤΕ το αφισα έτσι για να δείνει τον 2ο αριθμό όπου και αν βρίσκετε) :
ΠΡΟΓΡΑΜΜΑ ΦΙΛΟΙ_ΑΡΙΘΜΟΙ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Σ1, Σ2, Χ1, ΜΙΚ, ΜΕΓ, Ι
ΑΡΧΗ
ΓΡΑΨΕ 'Πάλι στους Πυθαγόρειους οφείλονται και οι φίλοι αριθμοί.'
ΓΡΑΨΕ 'Δυο αριθμοί λέγονται φίλοι αν ο καθένας ισούται'
ΓΡΑΨΕ 'με το άθροισμα των γνήσιων διαιρετών του άλλου.'
ΓΡΑΨΕ '---------------------------------------------------------'
ΓΡΑΨΕ 'Παρακαλώ δώστε τον αριθμό από τον οποίο θα αρχίσει να ψάχνει το πρόγραμμα.'
ΔΙΑΒΑΣΕ ΜΙΚ
ΓΡΑΨΕ 'Παρακαλώ δώστε τον αριθμό στον οποίο θα σταματήσει το πρόγραμμα.'
ΔΙΑΒΑΣΕ ΜΕΓ
ΑΝ ΜΕΓ<=ΜΙΚ Ή ΜΙΚ < 0 ΤΟΤΕ
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ 'Οι αριθμοί πρέπει να είναι μη αρνητικοί και ο 1ος μικρότερος από τον 2ο. παρακαλώ ξανα δώστε τους αριθμούς.'
ΔΙΑΒΑΣΕ ΜΙΚ
ΔΙΑΒΑΣΕ ΜΕΓ
ΜΕΧΡΙΣ_ΟΤΟΥ ΜΙΚ < ΜΕΓ ΚΑΙ ΜΙΚ >= 0
ΤΕΛΟΣ_ΑΝ
ΓΙΑ Χ1 ΑΠΟ ΜΙΚ ΜΕΧΡΙ ΜΕΓ
Σ1 <-- 1
Σ2 <-- 1
ΓΙΑ Ι ΑΠΟ 2 ΜΕΧΡΙ Α_Μ(Τ_Ρ(Χ1))
ΑΝ Χ1 MOD Ι = 0 ΤΟΤΕ
Σ1 <-- Σ1+Ι+(Χ1 DIV Ι)
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΝ Σ1 > Χ1 Ή Σ1 < ΜΙΚ ΤΟΤΕ
Ι <-- 1
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
Ι <-- Ι + 1
ΑΝ Σ1 MOD Ι = 0 ΤΟΤΕ
Σ2 <-- Σ2 + Ι + (Σ1 DIV Ι)
ΤΕΛΟΣ_ΑΝ
ΜΕΧΡΙΣ_ΟΤΟΥ Σ2>Χ1 Ή Α_Μ(Τ_Ρ(Χ1))=Ι Ή Ι>Χ1 !ΑΥΤΟ ΤΟ ΕΒΑΛΑ ΓΙΑΤΙ ΓΙΑ ΑΡΙΘΜΟΥΣ ΟΠΩΣ ΤΟ 0
ΑΝ Χ1=Σ2 ΤΟΤΕ !ΚΑΙ ΤΟ 1 ΠΡΟΣΠΕΡΝΑΕΙ ΚΑΤΕΥΘΕΙΑΝ ΤΗΝ ΤΙΜΗ ΤΟΥΣ ΤΟ Ι (ΑΡΧΙΖΕΙ ΑΠΟ ΤΟ 2)
ΓΡΑΨΕ 'ΟΙ ΑΡΙΘΜΟΙ', Χ1, Σ1, 'ΕΙΝΑΙ ΦΙΛΟΙ.'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Αν κάτι δεν έχω εξηγήσει ή δεν έχω εξηγήσει καλά ή υπάρχει κάποια ερώτηση ακόμα, ευπρόσδεκτη
Παράθεση:
ΣΤΟΙΧΕΙΟ: Γεννήτρια ψευδοτυχαίων αριθμών
ΣΥΝΤΑΞΗ: ΤΥΧΑΙΟΣ(επάνω_όριο)
ΠΑΡΑΔΕΙΓΜΑ: x <-- ΤΥΧΑΙΟΣ(100)
ΓΡΑΨΕ ΤΥΧΑΙΟΣ(10)+1
ΣΧΟΛΙΑ:Η συνάρτηση ΤΥΧΑΙΟΣ δημιουργεί ψευδοτυχαίους αριθμούς, η τιμή των οποίων κυμαίνεται ως εξής: 0 <= αριθμός < επάνω_όριο.
Το παραπάνω είναι από την βοήθεια της γλωσσομάθειας 8.5 στην οποία χρησιμοποιείτε (οι καινούριες εκδόσεις, αυτές μετά την 8.5, δεν την έχουν από όσο ξέρω)
Βάζεις έναν αριθμό στην παρένθεση και η συνάρτηση σου επιστρέφει έναν τυχαίο ακέραιο ο οποίος είναι μικρότερος αυτού που έβαλες και μεγαλύτερος ή ίσος του 0, μετά μπορείς να προσθέσεις κάποιον αριθμό σε αυτόν για να το φτάσεις στα όρια που θες.
Εγώ θα ήθελα αν γίνετε να μάθω τι κάνει ακριβός η ΤΥΧΑΙΟΣ γιατί για να λέει ψευδοτυχαίους δεν θα είναι εντελώς τυχαίοι, μάλλον θα υπακούν σε κάποιο τύπο ή κάτι τέτοιο, αν ξέρει κάποιος θα τον παρακαλούσα να πει.