Τώρα είναι Πέμ 28 Μαρ 2024 11:20 am

Όλοι οι χρόνοι είναι UTC + 2 ώρες [ DST ]




Δημιουργία νέου θέματος Απαντήστε στο θέμα  [ 1 Δημοσίευση ] 
Συγγραφέας Μήνυμα
 Θέμα δημοσίευσης: Αξιοπερίεργες αφαιρέσεις ...
ΔημοσίευσηΔημοσιεύτηκε: Σάβ 19 Μάιος 2007 01:31 am 
Χωρίς σύνδεση

Εγγραφή: Τετ 15 Δεκ 2004 04:26 am
Δημοσιεύσεις: 10
Τοποθεσία: Πρέβεζα
Syntax: [ Download ] [ Hide ]
!--------------------------------------------------------------------------------
! Αξιοπερίεργες αφαιρέσεις (περιγραφή).
! Για κάθε τετράδα ψηφίων ταξινομούμε τα 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 ΜΕΧΡΙ μήκος
    ΓΡΑΨΕ_ π[ι],' '
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΓΡΑΨΕ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
!*************************************************************************************
 

_________________
Βερύκιος Νίκος


Κορυφή
 Προφίλ  
Απάντηση με παράθεση  
Τελευταίες δημοσιεύσεις:  Ταξινόμηση ανά  
Δημιουργία νέου θέματος Απαντήστε στο θέμα  [ 1 Δημοσίευση ] 

Όλοι οι χρόνοι είναι UTC + 2 ώρες [ DST ]


Μέλη σε σύνδεση

Μέλη σε αυτή την Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες


Δεν μπορείτε να δημοσιεύετε νέα θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να απαντάτε σε θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επεξεργάζεστε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να διαγράφετε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επισυνάπτετε αρχεία σε αυτή τη Δ. Συζήτηση

Αναζήτηση για:
Μετάβαση σε:  
cron
Προβολές: