migf1 Δημοσ. 30 Νοεμβρίου 2012 Δημοσ. 30 Νοεμβρίου 2012 > #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; }
chdeal Δημοσ. 2 Δεκεμβρίου 2012 Δημοσ. 2 Δεκεμβρίου 2012 Μπορείς να το κάνεις με διαδοχικές διαιρέσεις (όπως ήδη έχεις βρει). Αν έχετε μάθει αναδρομή, η "αντίστροφη" εκτύπωση μπορεί να γίνει με αναδρομή. Κάνεις τη διαίρεση κατεβαίνοντας προς μεγαλύτερο βάθος στις αναδρομικές κλήσεις και εκτυπώνεις το αποτέλεσμα μετά την αναδρομική κλήση, επιστρέφοντας προς την "επιφάνεια".
albNik Δημοσ. 2 Δεκεμβρίου 2012 Δημοσ. 2 Δεκεμβρίου 2012 > void inv_bin(int n) { printf("%d", n%2); if(n>1) inv_bin(n/2); }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα