Σημειωματάαριο Δευτέρας 16 Οκτ. 2017

Σχετικά έγγραφα
Σημειωματάριο Τετάρτης 18 Οκτ. 2017

Σημειωματάριο Τετάρτης 4 Οκτ. 2017

Σημειωματάριο Δευτέρας 9 Οκτ. 2017

Γραφικά υπολογιστών Εργαστήριο 4 Εισαγωγή στις λίστες

Σημειωματάριο μαθήματος 1ης Νοε. 2017

Σημειωματάριο Τετάρτης 25 Οκτ. 2017

Σημειωματάριο Δευτέρας 23 Οκτ. 2017

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

Διάλεξη 1. Πράξεις Τελεστές Έλεγχος Ροής

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα

Σημειωματάριο Τετάρτης 11 Οκτ. 2017

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Θέματα Προγραμματισμού Η/Υ

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

Αλγόριθμοι για αυτόματα

Χρησιμοποιείται για να αποφασίσει το πρόγραμμα αν θα κάνει κάτι σε ένα σημείο της εκτέλεσής του, εξετάζοντας αν ισχύει ή όχι μια συνθήκη.

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

Κεφάλαιο 8: Προγραμματίζοντας αλγορίθμους έξυπνα και δημιουργικά

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Επαναληπτικές Ασκήσεις Χειμερινό Εξάμηνο 2016

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Υπολογισμός - Εντολές Επανάληψης

ΚΕΦΑΛΑΙΟ 5. Eπανάληψη με την εντολή while. 5.1 Εισαγωγή

Σημειωματάριο Δευτέρας 30 Οκτ. 2017

Σημειωματάριο Δευτέρας 13 Νοε. 2017

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Εισαγωγή στην Αριθμητική Ανάλυση

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ Εντολές επανάληψης Εντολές επανάληψης while for do-while ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ Παράδειγμα #1 Εντολή while

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) (PASCAL ) Εντολές Ελέγχου & Επανάληψης

Λύσεις για τις ασκήσεις του lab5

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

2.1 Διαιρετότητα, ισοϋπόλοιποι αριθμοί. q Z, a = b q + r.

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Εισαγωγή στον Προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

ΚΕΦΑΛΑΙΟ 10 ΕΝΤΟΛΕΣ ΕΠΙΛΟΓΗΣ (ή εντολές Ελέγχου και Επιλογής ή εντολές Επιλογής και Απόφασης)

Ψευδοκώδικας. November 7, 2011

Πληροφορική ΙΙ Θεματική Ενότητα 7

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Οι Φυσικοί Αριθμοί. Παρατήρηση: Δεν στρογγυλοποιούνται αριθμοί τηλεφώνων, Α.Φ.Μ., κωδικοί αριθμοί κλπ. Πρόσθεση Φυσικών αριθμών

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ PASCAL

Σημειωματάριο Τετάρτης 29 Νοε. 2017

Γραφικά υπολογιστών Εργαστήριο 10 Εισαγωγή στα Sprites

Διαδικασιακός Προγραμματισμός

for for for for( . */

3. Γράψτε μία εντολή που να εμφανίζει π.χ. «Πόσα είναι τα κορίτσια του;» και μία που να εμφανίζει: «Τα κορίτσια του Τζειμς Μποντ είναι 4»

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Βρόχοι. Εντολή επανάληψης. Το άθροισμα των αριθμών 1 5 υπολογίζεται με την εντολή. Πρόβλημα. Πώς θα υπολογίσουμε το άθροισμα των ακέραιων ;

5ο σετ σημειώσεων - Δείκτες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Εισαγωγή στον Προγραμματισμό Python Μάθημα 1: Μεταβλητές, τελεστές, είσοδος/έξοδος προγράμματος, συνθήκη ελέγχου if Νοέμβριος 2014 Χ. Αλεξανδράκη, Γ.

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ) ΚΑΙ ΜΑΘΗΜΑΤΩΝ ΕΙΔΙΚΟΤΗΤΑΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ΚΑΙ Β ) ΤΡΙΤΗ 13 ΙΟΥΝΙΟΥ 2017

Βασικά Στοιχεία Python 3

Shell Scripts: loops / if / test

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

Μάντεψε τον Αριθμό. Ενδεικτικές Απαντήσεις Φύλλου Εργασίας. Οδηγίες

Διαδικασιακός Προγραμματισμός

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

Η ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ Εντολές Επανάληψης REPEAT UNTIL, FOR, WHILE

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Κεφάλαιο Πέµπτο: Η Εξάσκηση

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

A2. Να γράψετε για κάθε περίπτωση τον αριθμό της πρότασης και δίπλα το γράμμα που δίνει τη σωστή επιλογή.

Όταν οι αριθμοί είναι ομόσημοι Βάζουμε το κοινό πρόσημο και προσθέτουμε

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Επαναληπτικές Ασκήσεις Χειµερινό Εξάµηνο 2014

Εύρεση ν-στού πρώτου αριθμού

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Εντολές for, while, do-while Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Ο βρόχος for Η εντολή for χρησιμοποιείται για τη δημιουργία επαναληπτικών βρόχων στη C

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 3: Συναρτήσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Σημειωματάριο Δευτέρας 4 Δεκ. 2017

Παίρνοντας Αποφάσεις 1

Στόχοι και αντικείμενο ενότητας. Βασικές κατασκευές ΓΠ. Έλεγχος ροής προγράμματος. #4.. Εντολές Επιλογής

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

Εντολές ελέγχου ροής if, for, while, do-while

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

Εισαγωγή στη Fortran. Μάθημα 1 ο. Ελευθερία Λιούκα

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

Τυχαίοι αριθμοί ρίξε μια «ζαριά»

Transcript:

Σημειωματάαριο Δευτέρας 16 Οκτ. 2017 Λίστες και ανακύκλωση for Είδαμε στην αρχή (ξανά) μερικά βασικά πράγματα για λίστες. Λίστα είναι μια πεπερασμένη ακολουθία από αντικείμενα (αριθμούς, strings, άλλες λίστες, οτιδήποτε) που γράφονται μέσα σε αγκύλες και χωρίζονται με κόμμα. Τα στοιχεία της λίστας αριθμούνται από το 0 έως το μήκος της πλην 1 (len(l) είναι το μήκος της λίστας L). Δείτε παρακάτω πώς αναφερόμαστε σε στοιχεία της λίστας. Στο τελευταίο παράδειγμα L[3][1] είναι το στοιχείο υπ' αριθμόν 1 (δεύτερο δηλ.) της λίστας L[3], της λίστας δηλ. που βρίσκεται στην υπ' αριθμόν 3 θέση (τέταρτη) της λίστας L. In [4]: L = [1, 2, "abc", [True, 3], "abcdef"] print(l) print(l[0]) print(l[3]) print(l[len(l)-1]) print(l[3][1]) [1, 2, 'abc', [True, 3], 'abcdef'] 1 [True, 3] abcdef 3 Τα slices δουλεύουν όπως ακριβώς και στα strings. In [7]: L = [1, 2, "abc", [True, 3], "abcdef"] print( L[1:] ) print( L[1:len(L)-1]) print( L[1:-1] ) [2, 'abc', [True, 3], 'abcdef'] [2, 'abc', [True, 3]] [2, 'abc', [True, 3]] Μπορεί κανείς να συγκολλήσει δύο λίστες με την πράξη +. Αν κάποιος θέλει απλά να προσθέσει ένα στοιχείο στο τέλος μιας λίστας μπορεί να χρησιμοποιήσει και τη μέθοδο.append() που έχουν οι λίστες. http://fourier.math.uoc.gr/~mk/prog1718/files/notes/20171016.html 1/6

In [10]: L=[1, 2, 3]; M=[True, False] X = L+M print(x) X = X + [ "abc" ] print(x) X.append(0.33) print(x) [1, 2, 3, True, False] [1, 2, 3, True, False, 'abc'] [1, 2, 3, True, False, 'abc', 0.33] Η βασική μορφή της ανακύκλωσης for φαίνεται παρακάτω. Έχουμε μια μεταβλητή, x στη συγκεκριμένη περίπτωση, και μια λίστα (την L εδώ) και το for μας κάνει τη μεταβλητή να πάρει μια προς μια όλες τις τιμές της λίστας, αρχίζοντας από την πρώτη και τελειώνοντας με την τελευταία. Στο παράδειγμα παρακάτω τυπώνουμε τα τετράγωνα όλων των αριθμών που βρίσκονται στη λίστα L. In [1]: L = [2.1, 3.2, 4, -7] for x in L: print("το τετράγωνο του {} είναι το {}".format(x, x*x)) Το τετράγωνο του 2.1 είναι το 4.41 Το τετράγωνο του 3.2 είναι το 10.240000000000002 Το τετράγωνο του 4 είναι το 16 Το τετράγωνο του -7 είναι το 49 Εδώ ξεκινάμε από την L και υπολογίζουμε μια νέα λίστα, την S, η οποία θα περιέχει τα τετράγωνα όλων των αριθμών της L. Πριν το for loop θέτουμε τη λίστα S να είναι κενή και για κάθε στοιχείο x της L κάνουμε append στο τέλος της S το τετράγωνο του x. In [2]: L = [2.1, 3.2, 4, -7] S = [] for x in L: S.append(x*x) print(s) [4.41, 10.240000000000002, 16, 49] Η συνάρτηση range(n) επιστρέφει ουσιαστικά μια λίστα που ξεκινάει από το 0 και πάει μέχρι το N-1. Είναι ο πιο βολικός τρόπος να κάνουμε μια ανακύκλωση ένα συγκεκριμένο αριθμό φορών. Στο παράδειγμα που ακολουθεί τυπώνουμε τα τετράγωνα όλων των αριθμών από 0 έως 10. http://fourier.math.uoc.gr/~mk/prog1718/files/notes/20171016.html 2/6

In [14]: for i in range(11): print(i*i) 0 1 4 9 16 25 36 49 64 81 100 Εδώ βλέπουμε πώς μπορούμε να τυπώσουμε κάτι με τη συνάρτηση print χωρίς να αλλάξει αυτόματα γραμμή. Αυτό γίνεται προσθέτοντας την (ονομασμένη) παράμετρο end='' στο τέλος. In [3]: print(1, end=''); print(2) # Με το σύμβολο ; μπορούμε να διαχωρίσουμε δύο εντολέ ς για να τις δώσουμε στην ίδια γραμμή 12 Εδώ χρησιμοποιούμε μια ανακύκλωση for μέσα σε μια άλλη ανακύκλωση for για να τυπώσουμε όλα τα ζεύγη (x, y) με x και y να παίρνουν όλες τις τιμές από 1 έως 10 το καθένα. Αλλάζουμε γραμμή μόνο αφού τελειώσει η εσωτερική ανακύκλωση (για το y). In [22]: for x in range(1, 11): # το x παίρνει όλες τις τιμές από 1 έως 10 for y in range(1, 11): # το y παίρνει όλες τις τιμές από 1 έως 10. Αυτό συμβ αίνει για κάθε τιμή του x. print( "({},{}) ".format(x, y), end='') print() # Αυτό είναι για να αλλάξουμε γραμμή εκτελείται μια φορά για κάθε τι μή του x (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9) (1,10) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (2,9) (2,10) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9) (3,10) (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (4,9) (4,10) (5,1) (5,2) (5,3) (5,4) (5,5) (5,6) (5,7) (5,8) (5,9) (5,10) (6,1) (6,2) (6,3) (6,4) (6,5) (6,6) (6,7) (6,8) (6,9) (6,10) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) (7,8) (7,9) (7,10) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (8,8) (8,9) (8,10) (9,1) (9,2) (9,3) (9,4) (9,5) (9,6) (9,7) (9,8) (9,9) (9,10) (10,1) (10,2) (10,3) (10,4) (10,5) (10,6) (10,7) (10,8) (10,9) (10,1 0) Εδώ δείχνουμε πώς να αποφασίσουμε αν ένας φυσικός αριθμός N (που τον δίνει ο χρήστης) είναι πρώτος ή όχι (ένας φυσικός αριθμός λέγεται πρώτος αριθμός αν οι μόνοι φυσικοί αριθμοί που τον διαιρούν είναι ο 1 και ο εαυτός του). http://fourier.math.uoc.gr/~mk/prog1718/files/notes/20171016.html 3/6

In [4]: # Ο χρήστης δίνει ένα string που μετατρέπεται σε ακέραιο με τη # συνάρτηση int και αποθηκεύεται στη μεταβλητή N # Η λογική αυτή μεταβλητή θα είναι True στο τέλος αν και μόνο αν ο N είναι πρώτος. # Κατ' αρχήν τη θέτουμε True, μια και δεν έχουμε ακόμη ανακαλύψει κάποιο διαιρέτη του N # Με το for αυτό διανύουμε όλους του φυσικούς αριθμούς από 2 έως N-1 # και δοκιμάζουμε αν είναι διαιρέτες του Ν. # Διαιρεί ο k τον N; # Αν ναι, θέτουμε # Για να συμβεί αυτό πρέπει το if μέσα στο loop να μην έχει "πιάσει" ποτέ Δώστε ένα φυσικό αριθμό > 1: 23864 Ο 23864 είναι σύνθετος Αν βρούμε ένα διαιρέτη k του N δε χρειάζεται να ψάξουμε και τους μετέπειτα φυσικούς για να αποφανθούμε αν ο N είναι πρώτος. Ξέρουμε ήδη ότι δεν είναι. Με την εντολή break που εκτελείται όταν βρούμε διαιρέτη "σπάμε" το for. Όποτε εκτελεστεί το break μέσα σε μια ανακύκλωση αυτή παύει να εκετελείται και η ροή του προγράμματος μεταφέρεται μετά την ανακύκλωση αυτή. In [30]: break # Σταματάει το for. Δώστε ένα φυσικό αριθμό > 1: 2734572354 Ο 2734572354 είναι σύνθετος Αν ένας φυσικός k διαιρεί τον N τότε έχουμε d = N/k να είναι ακέραιος. Επίσης, αν k > N και ο k διαιρεί τον N έπεται ότι d = N/k < N. Άρα αν έχουμε ελέγξει όλα τα k που είναι N και δεν έχουμε βρεί κανένα διαιρέτη του N έπεται ότι δε θα βρούμε ούτε από κει και πέρα. Άρα σε αυτή την περίπτωση ο N είναι πρώτος. http://fourier.math.uoc.gr/~mk/prog1718/files/notes/20171016.html 4/6

In [31]: if k*k > N: # Είναι το k μεγαλύτερο του ρίζα N; break # Σπάμε την ανακύκλωση αν έχουμε ελέγξει όλα τα k μικρότερα ή ίσα από ρίζα N. break Δώστε ένα φυσικό αριθμό > 1: 1562343 Ο 1562343 είναι σύνθετος Αν το N είναι σύνθετο θέλουμε να βρούμε όλους τους διαιρέτες του (τους μη τετριμμένους, αυτούς δηλ. διάφορους του 1 και του N). Ανοίγουμε μια λίστα divisors μέσα στην οποία βάζουμε κάθε k που βρίσκουμε ότι διαιρεί το N. Η λίστα αυτή είανι αρχικά κενή. Δεν σταματάμε το ψάξιμο πριν το N γιατί τώρα δε μας ενδιαφέρει απλά να πούμε ότι κάτι είναι σύνθετο αλλά και να βρούμε όλους τους διαιρέτες του. In [5]: divisors = [] # if k*k > N: # break divisors.append(k) # Το k είναι διαιρέτης, άρα μπαίνει στη λίστα divisor s print("οι διαιρέτες του {} είναι οι: ".format(n), end='') for d in divisors: # Εδώ τυπώνουμε όλους τους διαιρέτες του Ν. print("{} ".format(d), end='') Δώστε ένα φυσικό αριθμό > 1: 213432 Ο 213432 είναι σύνθετος Οι διαιρέτες του 213432 είναι οι: 2 3 4 6 8 12 24 8893 17786 26679 3 5572 53358 71144 106716 http://fourier.math.uoc.gr/~mk/prog1718/files/notes/20171016.html 5/6

Πώς μπορούμε ξανά να εξοικονομήσουμε χρόνο από το ψάξιμο εκμεταλλευόμενοι την ιδιότητα του όπως πριν; N Παρατηρούμε ότι αν βρούμε ένα διαιρέτη k του N μικρότερο ή ίσο από N τότε ο διαιρέτης N/k είναι μεγαλύτερος ή ίσος από N. Όλοι οι διαιρέτες του N δηλ. είναι ζευγαρωμένοι σε ζεύγη της μορφής (k, d) με N = kd και k N και d N. Φτιάχνουμε λοιπόν τη λίστα των k στη λίστα divisors1 (οι διαιρέτες N ) και τη λίστα των d στη λίστα divisors2 (οι διαιρέτες > N ). Όταν βάλουμε ένα αριθμό k στη λίστα divisors1 βάζουμε και τον αριθμό d = N/k στη λίστα divisors2, εκτός αν k = d (που συμβαίνει μόνο όταν N = k 2 = d 2. Έτσι όμως η λίστα divisors2 βγαίνει σε φθίνουσα σειρά. Πριν την τυπώσουμε λοιπόν τη διανύουμε ανάποδα. Η λίστα divisors2[::-1] είναι η λίστα των στοιχείων της divisors2 αλλά με την ανάποδη σειρά. Αυτό επιτυγχάνεται με το slice ::-1 μας λέει να διανύσουμε τη λίστα με βήμα -1, ανάποδα δηλ. In [6]: divisors1 = [] # Εδώ μπαίνουν οι διαιρέτες μικρότεροι ή ίσοι του ρίζα N divisors2 = [] # Εδώ μπαίνουν οι διαιρέτες μεγαλύτεροι του ρίζα N if k*k > N: break divisors1.append(k) # Βρήκαμε τον διαιρέτη k που είναι μικρότερος ή ίσος του ρίζα N if k*k!= N: # Αν το k δεν είναι ακριβώς ρίζα N divisors2.append(n//k) # βάζουμε το N/k στην άλλη λίστα print("οι διαιρέτες του {} είναι οι: ".format(n), end='') for d in divisors1+divisors2[::-1]: # Πριν τυπώσουμε τους διαιρέτες γυρνάμε ανάποδα τη λίστα divisors2 print("{} ".format(d), end='') Δώστε ένα φυσικό αριθμό > 1: 123431 Ο 123431 είναι σύνθετος Οι διαιρέτες του 123431 είναι οι: 7 11 49 77 229 539 1603 2519 11221 17633 http://fourier.math.uoc.gr/~mk/prog1718/files/notes/20171016.html 6/6