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

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

Δημοσ.

 

 

>
#include <stdio.h>

int main(void)
{
       int num = 26;
       int dig, i;
       int found = 0;

       printf("%d = ", num);
       for (i = 31; i >= 0; i--) {
               dig = num >> i;
               if (dig)
                       found = 1;
               if (found == 0)
                       continue;

               if (dig & 1)
                       printf("1");
               else
                       printf("0");
       }
       printf("\n");

       return 0;
}
Έξοδος:
26 = 11010

 

Αν δεν γίνεται να χρησιμοποιηθεί πίνακας (πχ γιατί δεν έχουν διδαχθεί ακόμη οι πίνακες), ένας όχι και τόσο αποδοτικός τρόπος είναι ο παραπάνω. Χάριν ευκολίας θεωρώ ότι ο int έχει 32 bits το οποίο φυσικά δεν είναι σίγουρο. Ο κώδικας παίρνει σβάρνα όλα τα ψηφία αλλά τυπώνει μόνο από το πρώτο άσσο και έπειτα λόγω της μεταβλητής found.

 

Edit: grrr ο editor μου έφαγε το μήνυμα.

 

Αν δεν έχουν διδαχθεί ούτε οι shifting και bitwise τελεστές, τότε το πιο εύκολο είναι με τον πίνακα που πρότεινε ο migf1 και την συνεχόμενη διαίρεση που έδειξες. Όσον αφορά το μέγεθος του πίνακα μπορούμε χωρίς να χαραμίσουμε πολύ μνήμη να θεωρούμε ως μέγεθος του τον αριθμό bits του τύπου το οποίο είναι γνωστό στον compiler. Αν υποθέσουμε ότι ο int έχει 32bit μέγεθος στην πλατφόρμα μας, τότε όποια τιμή και να μας δώσει ο χρήστης θα έχει το πολύ 32 δυαδικά ψηφία οπότε ορίζουμε τον πίνακα να έχει 32 στοιχεία.

 

 

 

Μιας και μάλλον έληξε η προθεσμία της άσκησης, το παραπάνω μπορεί να γίνει generalized κάπως έτσι...

 

>
#include <stdio.h>

/*****************************************************//**/
size_t minbits( size_t num )
{
   register int i;
   for (i=0; num; i++)
       num >>= 1;

   return i;
}
/*****************************************************//**/
int main( void )
{
   size_t num = 26;
   size_t nbits = minbits(num);

   for (size_t i=0; i < nbits; )
       printf("%c", num & ( 1 << (nbits - (++i)) ) ? '1' : '0');
   putchar('\n');

   return 0;
}

  • Απαντ. 32
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Δημοσ.

Μπορείς να το κάνεις με διαδοχικές διαιρέσεις (όπως ήδη έχεις βρει). Αν έχετε μάθει αναδρομή, η "αντίστροφη" εκτύπωση μπορεί να γίνει με αναδρομή. Κάνεις τη διαίρεση κατεβαίνοντας προς μεγαλύτερο βάθος στις αναδρομικές κλήσεις και εκτυπώνεις το αποτέλεσμα μετά την αναδρομική κλήση, επιστρέφοντας προς την "επιφάνεια".

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...