!--------------------------------------------------------------------------------
! Αξιοπερίεργες αφαιρέσεις (περιγραφή).
! Για κάθε τετράδα ψηφίων ταξινομούμε τα 4 ψηφία σε αύξουσα και φθίνουσα σειρά
! και έτσι δημιουργούμε 2 αριθμούς. πχ. για τους 1634 έχουμε τους 6431 και 1346.
! Αφαιρούμε τον μικρότερο απο τον μεγαλύτερο (6431-1345=5085). χρησιμοποιώντας τα 4 ψηφία του
! αποτελέσματος επαναλαμβάνουμε την διαδικασία (8550-0558=7992). Σταματάμε όταν η διαφορά
! γίνει μηδέν ή όταν βρίσκουμε πλέον τον ίδιο αριθμό (9772-2779=6993, 9963-3699=6264,
! 6642-2466 = 4176, 7641-1467= 6174 και σταματάμε γιατί δημιουργείται πλαί η ίδια
! αφαίρεση 7641-1467) για να μην οδηγηθούμε σε άπειρο LOOP
!
! Το ΕΡΩΤΗΜΑ:
! Να γράψετε πρόγραμμα που να υλοποιεί την διαδικασία για όλους τους 4-ψήφιους αριθμούς
! και να βρείτε τις απαντήσεις στα παρακάτω ερωτήματα:
! 1. Πόσες φορές θα γίνει μηδέν;
! 2. Όταν η διαφορά δεν είναι 0 πόσους διαφορετικούς αριθμούς βρίσκουμε;
! 3. Πόσες το πολύ, αφαιρέσεις θα κάνουμε μέχρι τότε
! (για να βρούμε κάποιον αριθμό που επαναλαμβάνεται);
! Προφανώς οι συνδυασμοί είναι 10000 (από 0000 μέχρι 9999).
!--------------------------------------------------------------------------------
! Για οικονομία στους πίνακες και γνωρίζοντας τα αποτελέσματα από πριν
! (έπειτα από προσωπική μελέτη του προβλήματος)
! το πρόγραμμα απλά ελέγχει και μετράει, χωρίς να ψάχνει όλα τα ερωτήματα.
! Δεν είναι δύσκολο να μετατραπεί το πρόγραμμα ώστε να αναζητά όλες τις απαντήσεις
! χωρίς να τις ξέρουμε, αλλά θα χρειαστεί ένας μεγάλος πίνακας....
!--------------------------------------------------------------------------------
! Η απάντηση:
! Ο τελευταίος αριθμός που βρίσκουμε (εκτός από το 0) είναι πάντα ο 1467.
! Έτσι οδηγούμαστε συνεχώς στην ίδια αφαίρεση: 7641-1467= 6174.
! Μοναδικές εξαιρέσεις οι 4-ψήφιοι αριθμοί που έχουν όλα τα ψηφία τους ίδια
! (0000, 1111, ... 9999) οπότε δίνουν διαφορά αμέσως το 0.
! Όλες οι άλλες αφαιρέσεις δίνουν τελική διαφορά το 6174 !!!!!! Περίεργο;
!
! Η Πρόκληση:
! Να γραφεί πρόγραμμα που να ελέγχει εξ αρχής το ίδιο γεγονός για 5,6,7-ψήφιους, (...)
! αλλά για να μην γράφουμε 5,6,... LOOP (και αλλάζουμε και το πρόγραμμά μας κάθε φορά)
! να γίνει αναδρομικά.
! ...
! ...
! Η απάντηση ; θα ακολουθήσει ... ...
!------------------------- -------------------------------------------------------
! Το πρόβλημα (χωρίς τη λύση) το βρήκα στο βιβλίο:
! Μαθηματικές σπαζοκεφαλιές τόμος 1, του Brian Bolt, εκδόσεις ΚΑΤΟΠΤΡΟ.
!------------------------- -------------------------------------------------------
! netnick
!---------
ΠΡΟΓΡΑΜΜΑ αφαιρέσεις
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: χ,αριθ[4],πλήθος,πλ[1000],σύνολο,ι,π1467,τελευταίος
ΑΚΕΡΑΙΕΣ: χ1,χ2,χ3,χ4,οχι1467,τριψηφια_διαφ,last
ΑΡΧΗ
ΓΡΑΨΕ 'ΑΡΧΗ...'
σύνολο <-- 0
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 100
πλ[ι] <-- 0
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
τελευταίος <-- 0
πλήθος <-- 0
οχι1467 <-- 0
π1467 <-- 0
τριψηφια_διαφ <-- 0
ΓΡΑΨΕ 'αριθμοί που δίνουν διαφορά μηδέν:'
! MAIN LOOP
ΓΙΑ χ1 ΑΠΟ 0 ΜΕΧΡΙ 9
ΓΙΑ χ2 ΑΠΟ 0 ΜΕΧΡΙ 9
ΓΙΑ χ3 ΑΠΟ 0 ΜΕΧΡΙ 9
ΓΙΑ χ4 ΑΠΟ 0 ΜΕΧΡΙ 9
! δημιούργησε όλους τους 4-ψήφιους αριθμούς.
αριθ[1] <-- χ1 ! Στην ΓΙΑ δεν δέχεται στοιχείο πίνακα ????
αριθ[2] <-- χ2 ! πχ. το ΓΙΑ α[1] ΑΠΟ 1 ΜΕΧΡΙ 9 δεν είναι αποδεκτό.
αριθ[3] <-- χ3
αριθ[4] <-- χ4
! είναι ή κύρια διαδικασία που υπολογίζει το βασικό ερώτημα: πόσες επαναλήψεις
! γίνονται μέχρι να βρούμε ίδιο αριθμό...
ΚΑΛΕΣΕ υπολόγισε_πλήθος_αφαιρέσεων(αριθ,πλήθος,τελευταίος)
! ή μεταβλητή "πλήθος" αναφέρει πόσες αφαιρέσεις γίνονται μέχρι να βρούμε
! σαν αποτέλεσμα αριθμό που δεν αλλάζει.
! Χρησιμοποιώ το +1 γιατί υπάρχει ή περίπτωση να έχουμε και 0 αφαιρέσεις
! (πχ για τον 1111 ... )
πλ[πλήθος+1] <-- πλ[πλήθος+1] + 1
σύνολο <-- σύνολο + 1
ΑΝ πλήθος = 0 ΤΟΤΕ
ΓΡΑΨΕ χ1,χ2,χ3,χ4,' πλήθος = ',πλήθος
ΤΕΛΟΣ_ΑΝ
! Απο προηγούμενη μελέτη γνωρίζω ότι το αποτέλεσμα θα είναι ή μηδεν (10 φορές)
! ή το 1467 .... ΝΑΙ ΕΙΝΑΙ ΠΟΛΥ ΠΑΡΑΞΕΝΟ ΑΛΛΑ ΕΤΣΙ ΕΙΝΑΙ !!!... (9990 φορές)
ΑΝ τελευταίος = 1467 ΤΟΤΕ
π1467 <-- π1467 + 1
ΑΛΛΙΩΣ
όχι1467 <-- οχι1467 + 1 ! Τελικά αυτό θα είναι μηδέν. Θα βρίσκουμε ή μηδέν ή 1467 !!!
ΑΝ αριθ[1] = 0 ΤΟΤΕ
τριψηφια_διαφ <-- τριψηφια_διαφ + 1
ΓΡΑΨΕ_ ' ',χ1,χ2,χ3,χ4 !,' ',τελευταίος,' ',πλήθος
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
! Εαν θέλαμε να βρούμε ποιοί αριθμοί είναι πιθανά αποτελέσματα τότε θα είχαμε πίνακα
! τελικός[10000] και αντί για την τελαυταία εμφωλευμένη ΑΝ θα είχα απλά το :
! ΑΝ τελευταίος =0 ΤΟΤΕ
! τελικός[1000] <-- τελικός[1000] + 1
! ΑΛΛΙΩΣ
! τελικός[τελευταίος] <-- τελικός[τελευταίος] + 1
! ΤΕΛΟΣ_ΑΝ
! και βέβαια θα έπρεπε μετά το τελος των 4 LOOP να διαπιστώσουμε ότι μόνο
! το τελικος[1467] = 9990 και τελικος[1000]=10 (που αντιστοιχει στο 0 αφαιρέσεις)
! είναι μή μηδενικοί αριθμοί.
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ
ΓΡΑΨΕ
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 100
ΑΝ πλ[ι] > 0 ΤΟΤΕ
last <-- ι
ΓΡΑΨΕ ι,'. Για ',πλ[ι],' αριθμούς έγιναν ',ι-1,' αφαιρέσεις.'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ 'Μέγιστος αριθμός αφαιρέσεων είναι το ', last-1,' και ελέγχθηκαν ',σύνολο,' αριθμοί.'
ΓΡΑΨΕ
ΓΡΑΨΕ 'Το 1467 βρέθηκε σαν τελικός αριθμός ',π1467,' φορές.'
ΓΡΑΨΕ 'Το 0 (ΜΗΔΕΝ) βρέθηκε σαν τελικός αριθμός ',οχι1467,' φορές.'
! ΓΡΑΨΕ 'Eνώ βρέθηκαν ',οχι1467,' αριθμοί με τα 4 ψηφία ίδια και είναι '
! ΓΡΑΨΕ 'μόνο αυτοί που δεν δίνουν διαφορά 1467.'
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
!*************************************************************************************
! Η διαδικασία αυτή υπολογίζει πόσες αφαιρέσεις πρέπει να κάνουμε ξεκινώντας από
! έναν τετραψήφιο αριθμό για να φτάσουμε σε αριθμό που πρέπει να σταματήσουμε.
!
ΔΙΑΔΙΚΑΣΙΑ υπολόγισε_πλήθος_αφαιρέσεων(πιν4,πλ,τ)
ΣΤΑΘΕΡΕΣ
Αυξ = 1
Φθιν = 0
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: πιν4[4],χ,ψ,ανω_κατω,πλήθος,διαφορά, νεο_χ,πλ,τ
ΑΡΧΗ
χ <-- -1
διαφορά <-- 1
πλήθος <-- 0
πλ <-- 0
ανω_κατω <-- Φθιν
ΚΑΛΕΣΕ ταξινόμηση(πιν4,ανω_κατω)
νεο_χ <-- φτιαξε_αριθμό(πιν4)
ΟΣΟ (νεο_χ <> χ) ΕΠΑΝΑΛΑΒΕ
χ <-- νεο_χ
ανω_κατω <-- Αύξ
ΚΑΛΕΣΕ ταξινόμηση(πιν4,ανω_κατω)
ψ <-- φτιαξε_αριθμό(πιν4)
διαφορά <-- ψ - χ
ΚΑΛΕΣΕ βρες_ψηφία(πιν4,διαφορά)
ανω_κατω <-- Φθιν
ΚΑΛΕΣΕ ταξινόμηση(πιν4,ανω_κατω)
νεο_χ <-- φτιαξε_αριθμό(πιν4)
πλήθος <-- πλήθος + 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
πλ <-- πλήθος
τ <-- νέο_χ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
!*************************************************************************************
! τα 4 ψηφία (0-9) του πίνακα αριθ[4] μας δημιουργούν ένα 4-ψήφιο αριθμό. Αυτόν τον
! αριθμό μας δίνει ή συνάρτηση αυτή.
!
ΣΥΝΑΡΤΗΣΗ φτιαξε_αριθμό(αριθ) : ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: αριθ[4],ι,β, δύναμη_β,χ
ΑΡΧΗ
β <-- 10
δύναμη_β <-- 1
χ <-- 0
ΓΙΑ ι ΑΠΟ 4 ΜΕΧΡΙ 1 ΜΕ ΒΗΜΑ -1
χ <-- χ + αριθ[ι] * δύναμη_β
δύναμη_β <-- δύναμη_β * β
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
φτιαξε_αριθμό <-- χ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
!*************************************************************************************
! ή διαδικασία αυτή προφανώς διαχωρίζει τα 4 ψηφία του αριθμού χ και τα τοποθετει
! στον πίνακα αριθ[4]. Έτσι θα μπορούμε να ταξινομήσουμε φθινουσα και αύξουσα τα ψηφία,
! και να αφιαρέσουμε τους 2 αριθμούς που προκείπτουν.
!
ΔΙΑΔΙΚΑΣΙΑ βρες_ψηφία(αριθ,χ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: αριθ[4],χ,ι,β,προσωρινή
ΑΡΧΗ
β <-- 10
ι <-- 4
προσωρινή <-- χ
ΟΣΟ (ι>0) ΚΑΙ (προσωρινή >= 0) ΕΠΑΝΑΛΑΒΕ
αριθ[ι] <-- προσωρινή MOD β
προσωρινή <-- προσωρινή DIV β
ι <-- ι - 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
!*************************************************************************************
! Ταξινόμηση αύξουσα ή φθίσουσα του πίνακα π 4 ψηφίων:
! Όταν ΑΝΩ_ΚΑΤΩ = 0 τότε κάνε αύξουσα ταξινόμηση αλλιώς
! εάν είναι ΑΝΩ_ΚΑΤΩ = 1 τότε φθίνουσα.
!
ΔΙΑΔΙΚΑΣΙΑ ταξινόμηση(π,ΑΝΩ_ΚΑΤΩ)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: π[4],ΑΝΩ_ΚΑΤΩ,ι,κ,ν,μήκος,προσωρινή
ΑΡΧΗ
μήκος <-- 4
ΓΙΑ ι ΑΠΟ 2 ΜΕΧΡΙ μήκος
ΓΙΑ κ ΑΠΟ μήκος ΜΕΧΡΙ 2 ΜΕ ΒΗΜΑ -1
ΑΝ ((π[κ] > π[κ-1]) ΚΑΙ (ΑΝΩ_ΚΑΤΩ = 1)) Η ((π[κ] < π[κ-1]) ΚΑΙ (ΑΝΩ_ΚΑΤΩ = 0)) ΤΟΤΕ
προσωρινή <-- π[κ]
π[κ] <-- π[κ-1]
π[κ-1] <-- προσωρινή
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
!*************************************************************************************
! απλά εμφανίζει τα 4 ψηφία ενός πίνακα στην οθόνη.
!
ΔΙΑΔΙΚΑΣΙΑ γραψε_πίνακα(π)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: π[4],ι,μήκος
ΑΡΧΗ
μήκος <-- 4
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ μήκος
ΓΡΑΨΕ_ π[ι],' '
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
!*************************************************************************************