Προς το περιεχόμενο

Πρόγραμμα με πρώτους αριθμούς


Newbie22

Προτεινόμενες αναρτήσεις

Αγόρασα το γνωστό βιβλίο του guttag για εισαγωγή στην επιστήμη των υπολογιστών.  Έχω μια άσκηση που μου ζητάει μέσω ενός nested for loop να υπολογίσω το άθροισμα των πρώτων αριθμών από το 3 ως το 999. Ζορίζομαι. 

Καμία ιδέα; πως μπορώ να αποθηκεύσω τον πρώτο αριθμό που δεν διαιρείται απόλυτα μόνο με το 1 και τον ευατο του;

Όποιος ευκαιρεί ας δώσει καμία ιδέα 😀

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σπάσε το πρόβλημα σε υποπροβλήματα. Αρχικά, φτιάξε μια συνάρτηση που παίρνει ως όρισμα έναν αριθμό και σου επιστρέφει true/false ανάλογα με το αν είναι πρώτος ο αριθμός.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχεις 3 προβλήματα να λύσεις:

1. Να διατρέξεις τους αριθμούς από το 3-999.

2. Να ελέγξεις κάθε φορά αν είναι πρώτος.

3. Να τους προσθέσεις.

Πού βοηθά το να αποθηκεύσεις κάποιο αριθμό που δεν είναι πρώτος;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γενικά έχει αρκετα optimization που μπορεις να κανεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Καλησπέρα σας,

Παραθέτω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

 

Επεξ/σία από ChrisGT7
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πολλά optimizations μπορούν να γίνουν, το θέμα δεν είναι να τα δώσουμε έτοιμα, αλλά να τα βρει μόνος/η ώστε να μάθει.

Βάζω σε spoiler μερικά ακόμα:

Spoiler

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

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

Έτσι, για έναν αριθμό κοντά στο 1.000.000 θα χρειαστεί να ψάξεις τους πρώτους που υπάρχουν ως την τ.ρ. του (~10.000), δηλαδή ~168 πρώτους-επαναλήψεις.

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είμαι περίεργος τι Optimization μπορεί να πάρει καθώς δοκίμασα να το κανω να τρέξει πιο γρήγορα και με ζυγούς και με περιορισμούς αλλά κάθε φορά κόστιζε στο execution τουλάχιστον για 10,000 αριθμούς που δοκίμασα

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

21 λεπτά πριν, masteripper είπε

Είμαι περίεργος τι Optimization μπορεί να πάρει καθώς δοκίμασα να το κανω να τρέξει πιο γρήγορα και με ζυγούς και με περιορισμούς αλλά κάθε φορά κόστιζε στο execution τουλάχιστον για 10,000 αριθμούς που δοκίμασα

 

Δοκίμασες αυτό που πρότεινα; Σε μένα με python και έναν κακό athlon επεξεργαστή τρέχει σε ~30'' ως τα 10.000.000.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...