• 締切済み

C言語

C言語 10進数n(0<n<256)を2進に変換させろ 配列を使うな do-whileでnを入力させることはできましたが、そこから先がわかりません。 for文を使えと言われたのですが……

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.10

私も作ってみましたが、文字列(=配列の一種)が使えないのは確かに不便ですね。 #include <stdio.h> #include <ctype.h> int main(void) {  int n; retry:  n = 0;  for (;;)  {   int c = getchar();   if (c == '\n')    break;   if (c < 0 || !isdigit(c))    goto retry;   n = n * 10 + c - '0';  }  if (!(0 < n && n < 256))   goto retry;  for (int i = 0; i < 8; i++)   putchar('0' + !!(n & (1 << (7 - i))));  putchar('\n'); }

  • xionggu
  • ベストアンサー率55% (5/9)
回答No.9

#8さん、 ご指摘の通り %b は C言語にはなかったですね。 他の方と重複しますが。 for(int i=7; i>=0;i--){ if( n & (0x1 << i)) { printf("1"); } else { printf("0"); } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

ななめな回答を戻してしまいますが, printfの書式に %b なんてありましたっけ>#7. まじめに考えると「配列を使うな」が地味に痛い. #include <stdio.h> #include <stdlib.h> #include <ctype.h> void putOutOfRangeError() { putchar('o'); putchar('u'); putchar('t'); putchar(' '); putchar('o'); putchar('f'); putchar(' '); putchar('r'); putchar('a'); putchar('n'); putchar('g'); putchar('e'); putchar('\n'); } void tobinary(int n) { if(n != 0) { tobinary(n/2); putchar('0'+n%2); } } int main() { int n = 0; for (;;) { int c = getchar(); if (! isdigit(c)) break; n = 10*n+(c-'0'); if (n >= 256) { putOutOfRangeError(); return EXIT_FAILURE; } } if (n == 0) { putOutOfRangeError(); return EXIT_FAILURE; } tobinary(n); putchar('\n'); return EXIT_SUCCESS; } とか?

  • xionggu
  • ベストアンサー率55% (5/9)
回答No.7

少し斜めな回答なのですが、皆さんが画面に表示されているだけのようなので printf("%b", n); は、如何でしょうか? forループは使っておりませんが。 あと #1 の方に一票です。

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.6

#2です。 他の方の回答と混同してしまっているようですね。 実現の仕方は何種類もあるので、ひとつの方法に絞ってコーディングすると良いと思います。 あと、私の方法だと、 >7~0はカウンタ変数です。 とあるようにループ回数は8回です。 その他ビットの積を取ったりする方法もあります。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

#3,4 です。 たびたび申し訳ありません。 >for文を使えと言われたのですが…… #3 で確かに for を使ってますが、これは・・ペケ #include <stdio.h> int main() { int n, b; for( n = 1; n < 256; n++ ){ printf( "%3d ", n ); for( b = 0x80; b > 0x08; b /= 2 ){ printf( "%d", ( ( n & b ) / b ) ); } printf( " " ); for( b = 0x08; b > 0; b /= 2 ){ printf( "%d", ( ( n & b ) / b ) ); } printf( "\n" ); } return( 0 ); }

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

#3 です 申し訳ない、冗長でした(余分なカッコ)。 正: printf( "%d", ( ( n & 0x80 ) / 0x80 ) );

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

「ビット論理積」を用いてみました。ただし ・nを入力させていない あしからず・・ #include <stdio.h> int main() { int n; for( n = 1; n < 256; n++ ){ printf( "%3d ", n ); printf( "%d", ( ( n & ( 0x80 ) ) / 0x80 ) ); printf( "%d", ( ( n & ( 0x40 ) ) / 0x40 ) ); printf( "%d", ( ( n & ( 0x20 ) ) / 0x20 ) ); printf( "%d", ( ( n & ( 0x10 ) ) / 0x10 ) ); printf( " " ); printf( "%d", ( ( n & ( 0x08 ) ) / 0x08 ) ); printf( "%d", ( ( n & ( 0x04 ) ) / 0x04 ) ); printf( "%d", ( ( n & ( 0x02 ) ) / 0x02 ) ); printf( "%d", ( ( n & ( 0x01 ) ) / 0x01 ) ); printf( "\n" ); } return( 0 ); }

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.2

2進数は http://ja.wikipedia.org/wiki/%E4%BA%8C%E9%80%B2%E6%B3%95#.E8.A8.98.E6.95.B0.E6.B3.95 で表現されます。 つまり、 1*a+2*b+4*c+8*d+16*e・・・・ で、a,b,c,d,e~は1か0になり、その順番を逆にしたものが2進数表現です。 1,2,4,8,16は2の累乗値です。 今回は上限指定で配列は使わないとのことなので、 ループのなかでは、2^7~2^0までを計算してやり、商が1なら1、商が0なら0を順に表示して、商が1ならその累乗値を元の値から引いて繰り返してやることになると思います。 7~0はカウンタ変数です。 たぶんdo-whileよりもforの方が書きやすいと思います。 今までならった部分でできると思いますので、ソースは自分で考えてください。 どうしてもダメな場合はそれまでに考えたソースを補足してください。

回答No.1

CではCOBOL等と違い「数」は「数」であって何進という概念がありませんから変換も糞も有りません。

関連するQ&A

専門家に質問してみよう