Newbie22 Δημοσ. 12 Μαρτίου 2024 Δημοσ. 12 Μαρτίου 2024 Αγόρασα το γνωστό βιβλίο του guttag για εισαγωγή στην επιστήμη των υπολογιστών. Έχω μια άσκηση που μου ζητάει μέσω ενός nested for loop να υπολογίσω το άθροισμα των πρώτων αριθμών από το 3 ως το 999. Ζορίζομαι. Καμία ιδέα; πως μπορώ να αποθηκεύσω τον πρώτο αριθμό που δεν διαιρείται απόλυτα μόνο με το 1 και τον ευατο του; Όποιος ευκαιρεί ας δώσει καμία ιδέα 😀
SOADNICK Δημοσ. 12 Μαρτίου 2024 Δημοσ. 12 Μαρτίου 2024 Σπάσε το πρόβλημα σε υποπροβλήματα. Αρχικά, φτιάξε μια συνάρτηση που παίρνει ως όρισμα έναν αριθμό και σου επιστρέφει true/false ανάλογα με το αν είναι πρώτος ο αριθμός. 2
masteripper Δημοσ. 13 Μαρτίου 2024 Δημοσ. 13 Μαρτίου 2024 Κάτι απλό χωρίς Optimization sum =0 for number in range(3, 1000): for divider in range(2,1000): if divider < number : if number % divider ==0: break else: sum += number break print (sum) 1
Lanike71 Δημοσ. 13 Μαρτίου 2024 Δημοσ. 13 Μαρτίου 2024 Έχεις 3 προβλήματα να λύσεις: 1. Να διατρέξεις τους αριθμούς από το 3-999. 2. Να ελέγξεις κάθε φορά αν είναι πρώτος. 3. Να τους προσθέσεις. Πού βοηθά το να αποθηκεύσεις κάποιο αριθμό που δεν είναι πρώτος;
Newbie22 Δημοσ. 13 Μαρτίου 2024 Μέλος Δημοσ. 13 Μαρτίου 2024 Σας ευχαριστώ όλους για τον κόπο σας. Προσπαθώ να κάνω μια εξάσκηση.
immortalgr Δημοσ. 13 Μαρτίου 2024 Δημοσ. 13 Μαρτίου 2024 Η λύση που σου έδωσε ο masterripper είναι σωστή, με 2 αλλαγές γίνεται και πιο γρήγορη.
ΠάρηςΓ Δημοσ. 14 Μαρτίου 2024 Δημοσ. 14 Μαρτίου 2024 Γενικά έχει αρκετα optimization που μπορεις να κανεις. Επειδή όλοι οι πρωτοι αριθμοί ειναι μονοί εκτος απο το 2 μπορεις να σκιπάρεις τους ζυγους. Να εφαρμόσεις το https://el.wikipedia.org/wiki/Κόσκινο_του_Ερατοσθένη#:~:text=Στα μαθηματικά%2C το Κόσκινο του,Ερατοσθένη%2C μαθηματικό της Αρχαίας Ελλάδας.
ChrisGT7 Δημοσ. 14 Μαρτίου 2024 Δημοσ. 14 Μαρτίου 2024 (επεξεργασμένο) Καλησπέρα σας, Παραθέτωs και μια πρόταση σε VBA: Sub SumPrwtwn() Dim I As Integer, X As Integer, Sum As Long Dim IsPrime As Boolean For I = 3 To 999 Step 2 IsPrime = True For X = 2 To I If I Mod X = 0 And X < I Then IsPrime = False Exit For End If Next If IsPrime Then Sum = Sum + I Next MsgBox "Το άθροισμα είναι: " & Sum End Sub Επεξ/σία 14 Μαρτίου 2024 από ChrisGT7
SOADNICK Δημοσ. 14 Μαρτίου 2024 Δημοσ. 14 Μαρτίου 2024 Πολλά optimizations μπορούν να γίνουν, το θέμα δεν είναι να τα δώσουμε έτοιμα, αλλά να τα βρει μόνος/η ώστε να μάθει. Βάζω σε spoiler μερικά ακόμα: Spoiler Χωρίς να μπλέξει πολύ ο κώδικας, νομίζω ότι το πιο αποδοτικό είναι να κρατάς σε λίστα κάθε πρώτο που βρίσκεις. Κατόπιν, για κάθε αριθμό που ελέγχεις χρειάζεται να τον διαιρέσεις μόνο με τους πρώτους που έχεις ήδη βρει. Επίσης, δεδομένου ότι οι διαιρέτες ενός αριθμού είναι "συμμετρικοί" ως προς την τετραγωνική του ρίζα, δεν χρειάζεται να ψάξεις για διαιρέτες μεγαλύτερους από αυτήν. Έτσι, για έναν αριθμό κοντά στο 1.000.000 θα χρειαστεί να ψάξεις τους πρώτους που υπάρχουν ως την τ.ρ. του (~10.000), δηλαδή ~168 πρώτους-επαναλήψεις.
masteripper Δημοσ. 14 Μαρτίου 2024 Δημοσ. 14 Μαρτίου 2024 Είμαι περίεργος τι Optimization μπορεί να πάρει καθώς δοκίμασα να το κανω να τρέξει πιο γρήγορα και με ζυγούς και με περιορισμούς αλλά κάθε φορά κόστιζε στο execution τουλάχιστον για 10,000 αριθμούς που δοκίμασα
SOADNICK Δημοσ. 14 Μαρτίου 2024 Δημοσ. 14 Μαρτίου 2024 21 λεπτά πριν, masteripper είπε Είμαι περίεργος τι Optimization μπορεί να πάρει καθώς δοκίμασα να το κανω να τρέξει πιο γρήγορα και με ζυγούς και με περιορισμούς αλλά κάθε φορά κόστιζε στο execution τουλάχιστον για 10,000 αριθμούς που δοκίμασα Δοκίμασες αυτό που πρότεινα; Σε μένα με python και έναν κακό athlon επεξεργαστή τρέχει σε ~30'' ως τα 10.000.000.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα