Αποστολέας Θέμα: Μπορεί κάποιος να με βοηθήσει???  (Αναγνώστηκε 6734 φορές)

kamer

  • Οπαδός
  • **
  • Μηνύματα: 10
Μπορεί κάποιος να με βοηθήσει???
« στις: 05 Σεπ 2010, 06:22:43 μμ »
Προσπάθησα να φτίαξω στην ψευδογλώσσα ενα πρόγραμμα που να βρίσκει τέλειους αριθμούς
Τέλειοι αριθμοί ονομάζονται αυτοί που το άθροισμα των διαιρετών τους είναι ίσο με τον ίδιο τον αριθμό (π.χ. 6, 28, 496...)
Ο τύπος για να βρεθούν αυτοί οι αριθμοί ειναι (2^(χ-1))*((2^χ)-1) με την προϋπόθεση ότι το χ και το (2^χ)-1 είναι πρώτοι.
Έχει ένα πρόβλημα με την εντολη mod. Καθώς εξ' ορισμού το (2^χ)-1 είναιπραγματική έκφραση δεν μπορεί να εφαρμοστεί η προαναφερθείσα εντολή.
Μπορείτε να μου προσφέρετε κάποια λύση;
Σας παραθέτω το πρόγραμμα από κάτω ωστε αν μπορεί κάποιος να με βοηθήσε

ΠΡΟΓΡΑΜΜΑ ΤΕΛΕΙΟΙ_ΑΡΙΘΜΟΙ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: χ, πλήθος_διαιρετών, διαιρέτης
  ΠΡΑΓΜΑΤΙΚΕΣ: βπρωτος, τελειος
ΑΡΧΗ
  χ <- 2
  τελειος <- 2^(χ - 1)*((2^χ) - 1)
  ΓΡΑΨΕ τελειος
  χ <- 3
  ΟΣΟ χ <= 99 ΕΠΑΝΑΛΑΒΕ
    πλήθος_διαιρετών <- 0
    διαιρέτης <- 2
    ΑΝ χ MOD διαιρέτης = 0 ΤΟΤΕ
      πλήθος_διαιρετών <- πλήθος_διαιρετών + 1
    ΑΛΛΙΩΣ
      διαιρέτης <- διαιρέτης + 1
    ΤΕΛΟΣ_ΑΝ
    ΟΣΟ πλήθος_διαιρετών < 1 ΚΑΙ διαιρέτης <= χ DIV 2 ΕΠΑΝΑΛΑΒΕ
      ΑΝ χ MOD διαιρέτης = 0 ΤΟΤΕ
        πλήθος_διαιρετών <- πλήθος_διαιρετών + 1
      ΑΛΛΙΩΣ
        διαιρέτης <- διαιρέτης + 2
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΑΝ πλήθος_διαιρετών < 1 ΤΟΤΕ
      βπρωτος <- 2^χ - 1
      πλήθος_διαιρετών <- 0
      διαιρέτης <- 2
      ΑΝ βπρωτος MOD διαιρέτης = 0 ΤΟΤΕ
        πλήθος_διαιρετών <- πλήθος_διαιρετών + 1
      ΑΛΛΙΩΣ
        διαιρέτης <- διαιρέτης + 1
      ΤΕΛΟΣ_ΑΝ
      ΟΣΟ πλήθος_διαιρετών < 1 ΚΑΙ διαιρέτης <= βπρωτος DIV 2 ΕΠΑΝΑΛΑΒΕ
        ΑΝ βπρωτος MOD διαιρέτης = 0 ΤΟΤΕ
          πλήθος_διαιρετών <- πλήθος_διαιρετών + 1
        ΑΛΛΙΩΣ
          διαιρέτης <- διαιρέτης + 2
        ΤΕΛΟΣ_ΑΝ
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      ΑΝ πλήθος_διαιρετών < 1 ΤΟΤΕ
        τελειος <- (2^χ)*((2^χ) - 1)
        ΓΡΑΨΕ τελειος
      ΤΕΛΟΣ_ΑΝ
      χ <- χ + 2
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ ι

sstergou

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 984
  • Program or be Programmed
    • pseudoglossa.gr
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #1 στις: 05 Σεπ 2010, 06:40:11 μμ »
Το πρόβλημα υφίσταται στην ΓΛΩΣΣΑ. Στην ψευδογλώσσα που είναι πιο χαλαρά τα πράγματα δεν υπάρχει τέτοιο θέμα.

Μια ιδέα είναι να δηλώσεις το τελειος ως ακέραια μεταβλητή και στην επίμαχη εκχώρηση να χρησιμοποιήσεις την συνάρτηση Α_Μ που επιστρέφει το ακέραιο μέρος ενός πραγματικού αριθμού, δηλ : τέλειος <- Α_Μ(2^(χ-1)*(2^χ)-1)).
Στάθης Στέργου - sstergouATgmailDOTcom - http://www.pseudoglossa.gr

kamer

  • Οπαδός
  • **
  • Μηνύματα: 10
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #2 στις: 05 Σεπ 2010, 06:47:54 μμ »
Η πρότασή σου δούλεψε
τώρα τρέχει υπέροχα
Το μόνο που χρειάζεται είναι να βελτιώσω την αποδοτικότητα του προγράμματος

kamer

  • Οπαδός
  • **
  • Μηνύματα: 10
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #3 στις: 05 Σεπ 2010, 07:32:06 μμ »
Τελικά το Α_Μ χρειαζόταν μετά από το βπρωτος
Για κάποιο λόγο όταν το έβαζα μετά από το τελειος έφερνε πίσω μερικές φορές λάθος αποτελέσματα

Το πρόγραμμα τώρα είναι ως εξής

ΠΡΟΓΡΑΜΜΑ ΤΕΛΕΙΟΙ_ΑΡΙΘΜΟΙ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: χ, απλήθος_διαιρετών, διαιρέτης, βπρωτος, βπλήθος_διαιρετών
  ΠΡΑΓΜΑΤΙΚΕΣ: τελειος
ΑΡΧΗ
  χ <- 2
  τελειος <- (2^(χ - 1)*((2^χ) - 1))
  ΓΡΑΨΕ τελειος
  χ <- 3
  ΟΣΟ χ <= 99 ΕΠΑΝΑΛΑΒΕ
    απλήθος_διαιρετών <- 0
    διαιρέτης <- 2
    ΑΝ χ MOD διαιρέτης = 0 ΤΟΤΕ
      απλήθος_διαιρετών <- απλήθος_διαιρετών + 1
    ΑΛΛΙΩΣ
      διαιρέτης <- διαιρέτης + 1
    ΤΕΛΟΣ_ΑΝ
    ΟΣΟ απλήθος_διαιρετών < 1 ΚΑΙ διαιρέτης <= χ DIV 2 ΕΠΑΝΑΛΑΒΕ
      ΑΝ χ MOD διαιρέτης = 0 ΤΟΤΕ
        απλήθος_διαιρετών <- απλήθος_διαιρετών + 1
      ΑΛΛΙΩΣ
        διαιρέτης <- διαιρέτης + 2
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΑΝ απλήθος_διαιρετών < 1 ΤΟΤΕ
      βπρωτος <- Α_Μ(2^χ - 1)
      βπλήθος_διαιρετών <- 0
      διαιρέτης <- 2
      ΑΝ βπρωτος MOD διαιρέτης = 0 ΤΟΤΕ
        βπλήθος_διαιρετών <- βπλήθος_διαιρετών + 1
      ΑΛΛΙΩΣ
        διαιρέτης <- διαιρέτης + 1
      ΤΕΛΟΣ_ΑΝ
      ΟΣΟ βπλήθος_διαιρετών < 1 ΚΑΙ διαιρέτης <= βπρωτος DIV 2 ΕΠΑΝΑΛΑΒΕ
        ΑΝ βπρωτος MOD διαιρέτης = 0 ΤΟΤΕ
          βπλήθος_διαιρετών <- βπλήθος_διαιρετών + 1
        ΑΛΛΙΩΣ
          διαιρέτης <- διαιρέτης + 2
        ΤΕΛΟΣ_ΑΝ
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      ΑΝ βπλήθος_διαιρετών < 1 ΤΟΤΕ
        τελειος <- ((2^(χ - 1))*((2^χ) - 1))
        ΓΡΑΨΕ τελειος
        χ <- χ + 2
      ΑΛΛΙΩΣ
        χ <- χ + 2
      ΤΕΛΟΣ_ΑΝ
    ΑΛΛΙΩΣ
      χ <- χ + 2
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

kamer

  • Οπαδός
  • **
  • Μηνύματα: 10
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #4 στις: 07 Σεπ 2010, 03:45:22 μμ »
Όταν βάζω την ΓΛΩΣΣΑ να εκτελέσει το παρακάτω πρόγραμμα βγάζει λάθος αποτελέσματα.

ΠΡΟΓΡΑΜΜΑ δοκιμη
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ν
ΑΡΧΗ
  ν <- 2^37 - 1
  ΓΡΑΨΕ ν
  ν <- Α_Μ(ν)
  ΓΡΑΨΕ ν
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

Ξέρει κανείς γιατί????

Keep Growing

  • Ομάδα διαγωνισμάτων 2011
  • *
  • Μηνύματα: 2023
  • Παναγιώτης Πέντσας Γυμνάσιο Σορωνής
    • Περισσότερες πληροφορίες για μένα
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #5 στις: 07 Σεπ 2010, 04:01:59 μμ »
μέχρι το 2^31 δουλεύει καλά.
Ο Έρωτας (του Εκπ/κου Πληροφορικού) στ' αλώνια της καλδέρας (του υπνωτισμού).

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 5707
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #6 στις: 07 Σεπ 2010, 05:35:10 μμ »
Γενικά ο Διερμηνευτής υποστηρίζει 64-bit ακεραίους, ακόμα και σε 32-bit συστήματα. Έτσι τα όρια των ακεραίων είναι τα ±2^63.
Ειδικά όμως για το ακέραιο μέρος Α_Μ, χρησιμοποιεί αναγκαστικά τη συνάρτηση Floor του Delphi, κι έτσι εκεί περιορίζεται σε 32-bit ακεραίους, δηλαδή ±2^31.


kamer

  • Οπαδός
  • **
  • Μηνύματα: 10
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #7 στις: 07 Σεπ 2010, 05:50:22 μμ »
Άμα είναι παραπάνω βγάζει λάθος αποτέλεσμα. . .  όπως για παράδειγμα -1 :'(
Υπάρχει κάποια ιδέα για το πως να προχωρήσω πέρα από το 8ο αποτέλεσμα σε αυτόν τον αλγόριθμο???

ΠΡΟΓΡΑΜΜΑ ΤΕΛΕΙΟΙ_ΑΡΙΘΜΟΙ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: χ, απλήθος_διαιρετών, διαιρέτης, βπρωτος, βπλήθος_διαιρετών
  ΠΡΑΓΜΑΤΙΚΕΣ: τελειος
ΑΡΧΗ
  χ <- 2
  τελειος <- (2^(χ - 1)*((2^χ) - 1))
  ΓΡΑΨΕ τελειος
  χ <- 3
  ΟΣΟ χ <= 99 ΕΠΑΝΑΛΑΒΕ
    απλήθος_διαιρετών <- 0
    διαιρέτης <- 2
    ΑΝ χ MOD διαιρέτης = 0 ΤΟΤΕ
      απλήθος_διαιρετών <- απλήθος_διαιρετών + 1
    ΑΛΛΙΩΣ
      διαιρέτης <- διαιρέτης + 1
    ΤΕΛΟΣ_ΑΝ
    ΟΣΟ απλήθος_διαιρετών < 1 ΚΑΙ διαιρέτης <= Α_Μ(χ^(1/2)) ΕΠΑΝΑΛΑΒΕ
      ΑΝ χ MOD διαιρέτης = 0 ΤΟΤΕ
        απλήθος_διαιρετών <- απλήθος_διαιρετών + 1
      ΑΛΛΙΩΣ
        διαιρέτης <- διαιρέτης + 2
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΑΝ απλήθος_διαιρετών < 1 ΤΟΤΕ
      βπρωτος <- Α_Μ(2^χ - 1)
      βπλήθος_διαιρετών <- 0
      διαιρέτης <- 2
      ΑΝ βπρωτος MOD διαιρέτης = 0 ΤΟΤΕ
        βπλήθος_διαιρετών <- βπλήθος_διαιρετών + 1
      ΑΛΛΙΩΣ
        διαιρέτης <- διαιρέτης + 1
      ΤΕΛΟΣ_ΑΝ
      ΟΣΟ βπλήθος_διαιρετών < 1 ΚΑΙ διαιρέτης <= Α_Μ(βπρωτος^(1/2)) ΕΠΑΝΑΛΑΒΕ
        ΑΝ βπρωτος MOD διαιρέτης = 0 ΤΟΤΕ
          βπλήθος_διαιρετών <- βπλήθος_διαιρετών + 1
        ΑΛΛΙΩΣ
          διαιρέτης <- διαιρέτης + 2
        ΤΕΛΟΣ_ΑΝ
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      ΑΝ βπλήθος_διαιρετών < 1 ΤΟΤΕ
        τελειος <- 2^(χ - 1)*((2^χ) - 1)
        ΓΡΑΨΕ τελειος
        χ <- χ + 2
      ΑΛΛΙΩΣ
        χ <- χ + 2
      ΤΕΛΟΣ_ΑΝ
    ΑΛΛΙΩΣ
      χ <- χ + 2
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

Keep Growing

  • Ομάδα διαγωνισμάτων 2011
  • *
  • Μηνύματα: 2023
  • Παναγιώτης Πέντσας Γυμνάσιο Σορωνής
    • Περισσότερες πληροφορίες για μένα
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #8 στις: 08 Σεπ 2010, 12:01:23 πμ »
Αν πας, στη Γλώσσα, στο μενού Εργαλεία -> Επιλογές -> ασάφειες και ζητήσεις στην συνάρτηση Α_Μ() να χρησιμοποιείται ο ορισμός της Πληροφορικής, τότε μπορεί να φτάσεις και μέχρι το 2^49 για μη επιστημονική γραφή του αριθμού και 2^62 για επιστημονική γραφή του αριθμού.  :D

Αν θέλεις πάλι, μπορείς να φτιάξεις εσύ μια συνάρτηση Α_Μ() σύμφωνα με την γενική μορφή της απεικόνισης στο δεκαδικό σύστημα.
Δες στον παρακάτω σύνδεσμο:
http://spinet.gr/glossomatheia/programs/viewtopic.php?f=6&t=722&view=previous

Παντού και πάντα όμως θα βρίσκεις φραγμούς. Το μόνο πράγμα που δεν έχει φραγμούς είναι η φαντασία μας.  :)
Ο Έρωτας (του Εκπ/κου Πληροφορικού) στ' αλώνια της καλδέρας (του υπνωτισμού).

Νίκος Αδαμόπουλος

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2823
  • Πύργος Ηλείας
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #9 στις: 08 Σεπ 2010, 11:21:32 πμ »
Αν το ζητούμενο είναι να εντοπιστούν όσο το δυνατό περισσότεροι τέλειοι αριθμοί, τότε ίσως πρέπει να επιλεχθεί κάποια άλλη γλώσσα προγραμματισμού πιο κατάλληλη για κάτι τέτοιο... αλλά και να εφαρμοστούν τεχνικές οι οποίες θα ξεπερνούν τους περιορισμούς που κάθε γλώσσα έχει...

Η ΓΛΩΣΣΑ έχει δημιουργηθεί μόνο για εκπαιδευτικούς σκοπούς και για εισαγωγή στον προγραμματισμό... Μάλιστα δεν έχει ούτε καν οριστεί πλήρως ή και με την απαιτούμενη σαφήνεια... Π.χ. δεν έχουν καθοριστεί τα όρια των αριθμών που θα μπορεί να διαχειρίζεται, κάτι που είναι από τα πρώτα που ορίζονται σε κάποια κανονική γλώσσα προγραμματισμού...

kamer

  • Οπαδός
  • **
  • Μηνύματα: 10
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #10 στις: 09 Σεπ 2010, 03:56:42 μμ »
Με την προηγούμενη πρόταση πράγματι εξαφανιστηκε το λάθος (αν και παραμένουν άλλα τα οποία ίσως και να μην γίνετε να επιλυθούν).
Όσων αναφορά την δεύτερη πρόταση είναι κάπως δύσκολο καθώς δεν γνωρίζω κάποια άλλη γλώσσα προγραμματισμου :-\
Τέλος, οι ενναλακτικοί αλγόριθμοι για το ακέραιο μέρος περιέχουν όλοι ένα μαθηματικό λάθος. Α_Μ(-123.54)=-124 και όχι -123 όπως βγάζει
Ίσως κάποιος ο οποίος έχει λογαριασμό στο site που αναφέρθηκε να μπορεί να το διορθώσει

Keep Growing

  • Ομάδα διαγωνισμάτων 2011
  • *
  • Μηνύματα: 2023
  • Παναγιώτης Πέντσας Γυμνάσιο Σορωνής
    • Περισσότερες πληροφορίες για μένα
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #11 στις: 09 Σεπ 2010, 04:16:05 μμ »
...Δεν είναι λάθος ακριβώς. Δες παρακάτω μια συζήτηση για το θέμα.

https://alkisg.mysch.gr/steki/index.php?topic=928.0
Ο Έρωτας (του Εκπ/κου Πληροφορικού) στ' αλώνια της καλδέρας (του υπνωτισμού).

Νίκος Αδαμόπουλος

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2823
  • Πύργος Ηλείας
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #12 στις: 09 Σεπ 2010, 07:45:39 μμ »
Αν πας, στη Γλώσσα, στο μενού Εργαλεία -> Επιλογές -> ασάφειες και ζητήσεις στην συνάρτηση Α_Μ() να χρησιμοποιείται ο ορισμός της Πληροφορικής ...

Το έχεις κάνει αυτό;

Keep Growing

  • Ομάδα διαγωνισμάτων 2011
  • *
  • Μηνύματα: 2023
  • Παναγιώτης Πέντσας Γυμνάσιο Σορωνής
    • Περισσότερες πληροφορίες για μένα
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #13 στις: 09 Σεπ 2010, 08:08:29 μμ »
Ναι, Νίκο, το δοκίμασα.
Ο Έρωτας (του Εκπ/κου Πληροφορικού) στ' αλώνια της καλδέρας (του υπνωτισμού).

Νίκος Αδαμόπουλος

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2823
  • Πύργος Ηλείας
Απ: Μπορεί κάποιος να με βοηθήσει???
« Απάντηση #14 στις: 09 Σεπ 2010, 09:03:25 μμ »
... τον kamer εννοούσα...! Αν αλλάξει τη ρύθμιση δεν θα έχει πρόβλημα με το ΑΜ...