c - Printing to output: integer as sum of powers of 2 -
i had exam, , i've been struggling ever since. have array of integers(ex. 13, 6, 21, 4), , need make output looks like:
13 = 2^3 + 2^2 + 2^0 6 = 2^2 + 2^1 21 = 2^4 + 2^2 + 2^0 4 = 2^2
here's i've got far.
#include <stdio.h> #define max 100 int main() { int niz[max], nizb, n, i, ones, k; while(1) { printf("array length: "); scanf("%d", &n); if (n<=0 || n>max) break; printf("array elements: "); for(i=0;i<n;i++){ scanf("%d", &niz[i]); if (niz[i] <=0) { printf("error! wrong value. enter new one: "); scanf("%d", &niz[i]); } } for(i=0;i<n;i++) { nizb = niz[i]; ones = 0; for(k=0; k < 16; k++) { //what should here? } } } }
i'm stuck here. dont know how many bits should use, , how c sees bits of integer. i'm using var 'k' add string in format '2^3 + 2^2 ...', k value of 'for' iteration. have made assumption length of integer 16, im not sure since on sheet of paper.
i want big everyone!!!
not sure has twos-complement (which particular way of representing negative numbers). trying express integer sum of powers of 2, apparently. here's way i'd it, isn't better or worse other answers...
void powersum(int n) { int powers[sizeof(int) << 3]; int i; char *sep = ""; printf("%d = ", n); powers[0] = 0; (i = 0; n; n >>= 1, ++i) powers[i] = n & 1; while (--i >= 0) { if (powers[i]) { printf("%s2^%d", sep, i); sep = " + "; } } printf("\n"); }
edit: here's version doesn't use stack-allocated array, tradeoff has go around loop more (once each bit, opposed looping until highest 1-bit found):
void powersum2(int n) { int = (sizeof(int) << 3) - 2; int m = 1 << i; char *sep = ""; printf("%d = ", n); while (m) { if (n & m) { printf("%s2^%d", sep, i); sep = " + "; } m >>= 1; --i; } printf("\n"); }
Comments
Post a Comment