<問題> 正の10進数を入力、2進数へ基数変換せよ。
実行例: 重みを見つけていく方法 (割り算しない方法)
[tsuchiya@www1 arc]$ ./a.out 10進数 : 123 ← ここは、入力 2の 6乗 64 ← 含まれている重みを表示 2の 5乗 32 2の 4乗 16 2の 3乗 8 2の 1乗 2 2の 0乗 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ← 2の指数 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 ← ビット 0000 0000 0111 1011 です。 [tsuchiya@www1 arc]$ ./a.out 10進数 : 65535 2の 15乗 32768 2の 14乗 16384 2の 13乗 8192 2の 12乗 4096 2の 11乗 2048 2の 10乗 1024 2の 9乗 512 2の 8乗 256 2の 7乗 128 2の 6乗 64 2の 5乗 32 2の 4乗 16 2の 3乗 8 2の 2乗 4 2の 1乗 2 2の 0乗 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
コメント
解答例 #include <stdio.h> #define N 16 int main() { int w[N]; /* 重みを格納 */ int b[N]; /* 2進数の文字列 */ int weight; /* 重み */ int n; /* 入力 10進数 */ int i; /* 配列の添え字 */ i = 0; /* 初期値 */ weight = 1; /* 初期値 2の0乗は1 */ w[i] = weight; /* w[0] のセット */ b[i] = 0; /* b[0]のセット */ /* 重み配列を計算、初期化。b配列を全て0に初期化 */ for (i = 1; i < N; i++) { weight = weight*2; w[i] = weight; b[i] = 0; } /* 入力 */ printf("10進数 : "); scanf("%d", &n); /* nが0になるまで、重みを大きい値から弾き続ける */ i = N - 1; while (n) { if (n >= w[i]) { n = n - w[i]; printf("2の%3d乗 %6d\n", i, w[i]); /* 引き算できたらprintf */ b[i] = 1; /* その桁は、1 */ } i--; } /* 大きい値から0へ */ for (i = N - 1; i >= 0; i--) { printf("%3d",i); } printf("\n",i); /* 各桁が0 か 1か */ for (i = N - 1; i >= 0; i--) { printf("%3d",b[i]); } printf("\n",i); return 0; }