Υλοποίηση Ακέραιου Μέρους

Ξεκίνησε από progmat, 01 Φεβ 2020, 07:22:18 ΜΜ

« προηγούμενο - επόμενο »

bugman

Για αρνητικούς, όπου το -13.12321 δίνει -14

Αν βγάλουμε αυτές τις δυο γραμμές:
  ΑΛΛΙΩΣ_ΑΝ -c + a > 0 ΤΟΤΕ
    Π_Α_Μ <- -c - 1
τότε θα έχουμε -13

(χρειάστηκα μια μεταβλητή ακόμα για να κρατήσω το πρόσημο της αρχικής μεταβλητής)


ΠΡΟΓΡΑΜΜΑ bugman_A_Y2
ΑΡΧΗ
  ΓΡΑΨΕ Π_Α_Μ(11111111111021200121.2) 
  ΓΡΑΨΕ Π_Α_Μ(-13.12321) 
  ΓΡΑΨΕ Π_Α_Μ(1210023.12321) 
  ΓΡΑΨΕ Π_Α_Μ(3.92321) 
  ΓΡΑΨΕ Π_Α_Μ(3.92321*10^-30) 
  ΓΡΑΨΕ Π_Α_Μ(9.111292321) 
  ΓΡΑΨΕ Π_Α_Μ(123456789.01) 
  ΓΡΑΨΕ Π_Α_Μ(123123456456789.123) 
  ΓΡΑΨΕ Π_Α_Μ(123123000456789.123) 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
ΣΥΝΑΡΤΗΣΗ Π_Α_Μ(a): ΠΡΑΓΜΑΤΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: a, b, c
  ΛΟΓΙΚΕΣ: d
ΑΡΧΗ
  b <- 1
  d <- a >= 0
  a <- Α_Τ(a) 
  ΟΣΟ b < a ΕΠΑΝΑΛΑΒΕ
    b <- b*10
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  c <- 0
  b <- b/10
  ΟΣΟ b >= 1 ΕΠΑΝΑΛΑΒΕ
    ΟΣΟ c + b <= a ΚΑΙ c <> c + b ΕΠΑΝΑΛΑΒΕ
      c <- c + b
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    b <- b/10
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΝ d ΤΟΤΕ
    Π_Α_Μ <- c
  ΑΛΛΙΩΣ_ΑΝ -c + a > 0 ΤΟΤΕ
    Π_Α_Μ <- -c - 1
  ΑΛΛΙΩΣ
    Π_Α_Μ <- -c
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ



1.11111111110212E19
-14.00
1210023.00
3.00
0.00
9.00
123456789.00
123123456456789.00
123123000456789.00

gthal

Παράθεση από: George Eco στις 08 Φεβ 2020, 07:12:48 ΜΜ
.
.
.
Οπότε we got a winner!
Από την άλλη, θέλω να δω αν μπορώ να διορθώσω τη δική μου προσέγγιση.
Νομίζω δικαιούμαι την ευκαιρία μιας κι έκανα το testing.

I'll be back! :P :P :P
Τι έκατσες κι έκανες!!!
Μένω άφωνος ! 
Βεβαίως και δικαιούσαι! θα την περιμένω   ;)
Φιλικά,
Γιώργος Θαλασσινός

Γιαννούλης Γιώργος

Για να βάλω και γω το λιθαράκι μου, και επειδή η υλοποίηση του bugman μου άρεσε, άλλα επιστρέφει πραγματικό ενώ σκοπός μας είναι να γυρίζει ακέραιο.
Η βασική λογική της υλοποίησης είναι:

  • αρχικά του υπολογισμού των ψηφίων του αριθμού που δόθηκε
  • αφαιρεί τις δυνάμεις του 2 που απαιτούνται ώστε να σχηματιστεί ο ακέραιος αριθμος (αλα ρωσικά  :D ;D :D)
ΠΡΟΓΡΑΜΜΑ Ακεραιο_Μερος
ΑΡΧΗ
  ΓΡΑΨΕ Α_Μ_custom(11111111100121.2) 
  ΓΡΑΨΕ Α_Μ_custom(-13.12321) 
  ΓΡΑΨΕ Α_Μ_custom(1210023.12321) 
  ΓΡΑΨΕ Α_Μ_custom(3.92321) 
  ΓΡΑΨΕ Α_Μ_custom(3.92321*10^-30) 
  ΓΡΑΨΕ Α_Μ_custom(9.111292321) 
  ΓΡΑΨΕ Α_Μ_custom(123456789.01) 
  ΓΡΑΨΕ Α_Μ_custom(123123456456789.123) 
  ΓΡΑΨΕ Α_Μ_custom(123123000456789.123) 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ Α_Μ_custom(χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: δυναμη, προσημο, αμ
  ΠΡΑΓΜΑΤΙΚΕΣ: χ, χ_προσωρινο
ΑΡΧΗ
  !Ευρεση προσήμου
  προσημο <- 1
  ΑΝ χ < 0 ΤΟΤΕ
    προσημο <- -1
  ΤΕΛΟΣ_ΑΝ
  χ_προσωρινο <- χ*προσημο

  !Υπολογισμός μέγιστης δύναμης του 2 που θα χρειαστούμε
  δυναμη <- 0
  ΟΣΟ 2^δυναμη <= χ_προσωρινο ΕΠΑΝΑΛΑΒΕ
    δυναμη <- δυναμη + 1
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  αμ <- 0
  ΓΙΑ δυναμη ΑΠΟ δυναμη ΜΕΧΡΙ 0 ΜΕ_ΒΗΜΑ -1
    ΑΝ χ_προσωρινο >= 2^δυναμη ΤΟΤΕ
      !Επειδή η ^ επιστρέφει πραγματικό και θέλουμε ακέραιο
      !και δεν μπορούμε να χρησιμοποιήσουμε την Α_Μ
      αμ <- αμ + εις_την(2, δυναμη) 
      χ_προσωρινο <- χ_προσωρινο - 2^δυναμη
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  αμ <- αμ*προσημο
        !Επειδή η υλοποίηση γίνεται με τον μαθηματικό ορισμό για αρνητικές τιμές
  ΑΝ προσημο = -1 ΚΑΙ αμ <> χ ΤΟΤΕ
    αμ <- αμ - 1
  ΤΕΛΟΣ_ΑΝ
  Α_Μ_custom <- αμ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

!Υπολογίζει τη δύναμη βαση^εκθετης αλλά επιστρέφει ακέραιο, χωρίς χρηση Α_Μ
ΣΥΝΑΡΤΗΣΗ εις_την(βαση, εκθετης): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: βαση, εκθετης, γινομενο
ΑΡΧΗ
  γινομενο <- 1
  ΓΙΑ εκθετης ΑΠΟ εκθετης ΜΕΧΡΙ 1 ΜΕ_ΒΗΜΑ -1
    γινομενο <- γινομενο*βαση
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  εις_την <- γινομενο
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

bugman

#18
Γιαννούλης Γιώργος, δουλεύει μεν αλλά με περιορισμούς πχ στο

Η ΓΡΑΨΕ Α_Μ_custom(11111111100121.2*10^10) δίνει ότι να είναι (6371445259360010240) ενώ η αρχική δική μου δίνει το ακέραιο μέρος (ως πραγματική) 1.11111111110212E29

Παρακάτω έχω αφαιρέσει την ΣΥΝΑΡΤΗΣΗ εις_την(βαση, εκθετης): ΑΚΕΡΑΙΑ
και έχω βάλει έναν πίνακα εισ_την[100]
Έτσι έχουμε το λεγόμενο look up table (ή πίνακα αντιστοιχιών). Αν είχαμε γενικές (σφαιρικές) μεταβλητές ο πίνακας θα μπορούσε να ήταν "μόνιμος", έτσι σε κάθε κλήση θα κερδίζαμε σε ταχύτητα. Κάτι τέτοιο δεν μπορεί να γίνει στη γλώσσα. Θα πρέπει να το δίνουμε σαν παράμετρο, και θα γίνεται αντιγραφή όλου του πίνακα. Οπότε ξεχνάμε το πίνακα να είναι φτιαγμένος μια φορά. Καθώς υπολογίζουμε τη μέγιστη δύναμη παράγουμε τα στοιχεία του πίνακα που θέλουμε. Έχουμε έναν αρκετά μεγάλο πίνακα για να παρέχουμε όλα τα στοιχεία.

ΠΡΟΓΡΑΜΜΑ Ακεραιο_Μερος2
ΑΡΧΗ
  ΓΡΑΨΕ Α_Μ_custom(11111111100121.2) 
  ΓΡΑΨΕ Α_Μ_custom(-13.12321) 
  ΓΡΑΨΕ Α_Μ_custom(1210023.12321) 
  ΓΡΑΨΕ Α_Μ_custom(3.92321) 
  ΓΡΑΨΕ Α_Μ_custom(3.92321*10^-30) 
  ΓΡΑΨΕ Α_Μ_custom(9.111292321) 
  ΓΡΑΨΕ Α_Μ_custom(123456789.01) 
  ΓΡΑΨΕ Α_Μ_custom(123123456456789.123) 
  ΓΡΑΨΕ Α_Μ_custom(123123000456789.123) 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ Α_Μ_custom(χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: δυναμη, προσημο, αμ, εισ_την[100] 
  ΠΡΑΓΜΑΤΙΚΕΣ: χ, χ_προσωρινο
ΑΡΧΗ
 !Ευρεση προσήμου
  προσημο <- 1
  ΑΝ χ < 0 ΤΟΤΕ
    προσημο <- -1
  ΤΕΛΟΣ_ΑΝ
  χ_προσωρινο <- χ*προσημο

 !Υπολογισμός μέγιστης δύναμης του 2 που θα χρειαστούμε
  δυναμη <- 0
  εισ_την[δυναμη + 1] <- 1
  ΟΣΟ 2^δυναμη <= χ_προσωρινο ΕΠΑΝΑΛΑΒΕ
    δυναμη <- δυναμη + 1
    εισ_την[δυναμη + 1] <- εισ_την[δυναμη]*2
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  αμ <- 0
  ΓΙΑ δυναμη ΑΠΟ δυναμη ΜΕΧΡΙ 0 ΜΕ_ΒΗΜΑ -1
    ΑΝ χ_προσωρινο >= 2^δυναμη ΤΟΤΕ
 !Επειδή η ^ επιστρέφει πραγματικό και θέλουμε ακέραιο
 !και δεν μπορούμε να χρησιμοποιήσουμε την Α_Μ
      αμ <- αμ + εισ_την[δυναμη + 1] 
      χ_προσωρινο <- χ_προσωρινο - 2^δυναμη
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  αμ <- αμ*προσημο
 !Επειδή η υλοποίηση γίνεται με τον μαθηματικό ορισμό για αρνητικές τιμές
  ΑΝ προσημο = -1 ΚΑΙ αμ <> χ ΤΟΤΕ
    αμ <- αμ - 1
  ΤΕΛΟΣ_ΑΝ
  Α_Μ_custom <- αμ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ



Και η γραμμή
      χ_προσωρινο <- χ_προσωρινο - 2^δυναμη


μπορεί να γίνει:
      χ_προσωρινο <- χ_προσωρινο - εισ_την[δυναμη + 1]


εδώ αντί για 6371445259360010240 γυρίζει -1
στο ΓΡΑΨΕ Α_Μ_custom(11111111100121.2*10^10)

bugman

#19
Με μια δεύτερη ματιά, ούτε ο πίνακας χρειάζεται:
Διόρθωσα και το λάθος του -1 στο τελικό αριθμό (υπάρχει μια Αν ακόμα δείτε το πρόγραμμα)

Νεα Διόρθωση για το ΓΡΑΨΕ Α_Μ_custom(-4.92321)  (τώρα δίνει -5 και όχι -6).


Αφαίρεσα μια μεταβλητή (η Σούμα έγινε Δύναμη και αφαιρέθηκε η παλιά Δύναμη).

ΠΡΟΓΡΑΜΜΑ Ακεραιο_Μερος3_2
ΑΡΧΗ
  ΓΡΑΨΕ Α_Μ_custom(11111111100121.2) 
  ΓΡΑΨΕ Α_Μ_custom(-13.12321) 
  ΓΡΑΨΕ Α_Μ_custom(1210023.12321) 
  ΓΡΑΨΕ Α_Μ_custom(-4.92321) 
  ΓΡΑΨΕ Α_Μ_custom(3.92321*10^-30) 
  ΓΡΑΨΕ Α_Μ_custom(9.111292321) 
  ΓΡΑΨΕ Α_Μ_custom(123456789.01) 
  ΓΡΑΨΕ Α_Μ_custom(123123456456789.123) 
  ΓΡΑΨΕ Α_Μ_custom(123123000456789.123) 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ Α_Μ_custom(χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: προσημο, αμ, δύναμη
  ΠΡΑΓΜΑΤΙΚΕΣ: χ, χ_προσωρινο
ΑΡΧΗ
 !Ευρεση προσήμου
  προσημο <- 1
  ΑΝ χ < 0 ΤΟΤΕ
    προσημο <- -1
  ΤΕΛΟΣ_ΑΝ
  χ_προσωρινο <- χ*προσημο

  δύναμη <- 1
  ΟΣΟ δύναμη <= χ_προσωρινο ΕΠΑΝΑΛΑΒΕ
    δύναμη <- δύναμη*2
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  αμ <- 0
  ΟΣΟ δύναμη > 1 ΕΠΑΝΑΛΑΒΕ
    ΑΝ χ_προσωρινο >= δύναμη ΤΟΤΕ
 !Επειδή η ^ επιστρέφει πραγματικό και θέλουμε ακέραιο
 !και δεν μπορούμε να χρησιμοποιήσουμε την Α_Μ
      αμ <- αμ + δύναμη
      χ_προσωρινο <- χ_προσωρινο - δύναμη
    ΤΕΛΟΣ_ΑΝ
    δύναμη <- δύναμη div 2
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΑΝ χ_προσωρινο >= 1 ΤΟΤΕ
    αμ <- αμ + 1
  ΤΕΛΟΣ_ΑΝ
  αμ <- αμ*προσημο
 !Επειδή η υλοποίηση γίνεται με τον μαθηματικό ορισμό για αρνητικές τιμές
  ΑΝ προσημο = -1 ΚΑΙ αμ <> χ ΤΟΤΕ
    αμ <- αμ - 1
  ΤΕΛΟΣ_ΑΝ
  Α_Μ_custom <- αμ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ