• 締切済み

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

  • C言語について…

    C言語についてですが… while文とdo while文はどう違うんですか?プログラムの書き方が違うくらいでしょうか? またwhile文とdo while文のどちらかしか使えない場合、どちらを使いますか?理由もお願いします。

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語のプログラムについて

    C言語のプログラムについて 3桁の自然数の中で、自分自身を含めた約数が奇数になるものがいくつあるかを求めるプログラムを作りたいのですが、swich文を使って、6通りの方法で出そうとしていまして、 while 文、 for文、 do while文に加え、 for文のを、1つの関数として独立させたもの、 さらに、for文のを重ループ部分のそれぞれのループに対応して、2つの関数として独立させたもの、 そして、この2つの関数のどちらともをループを用いずに再帰呼び出しを用いたもの の6通りで出したいのですが、swich文を使うところは自力でできたのですが、あとの6つそれぞれのプログラムの組み方がわかりません。 教えていただけないでしょうか?ややこしい書き方をしてすいません・・・。

  • c言語

    c言語で自然数nを入力、2以上n以下の偶数の累積sumを求めるプログラムをfor文を使って作りたいです。 教えていただきたいです。

  • C言語について質問です。

    C言語について質問です。    問題:繰り返し命令と階乗の計算 カウンタ用変数nの値を1から10まで1ずつ変化させて、その値を階乗用変数Kiに順次、掛け算していき、10の階乗を求めよ。 ki=1×2×3×4×5×6・・・・・×9×10 <==10! また、1/n!は小数点以下10桁まで求めよ。 実行結果は    n                 n!             1/n!    1                 1             1、0000000000    2                 2             0、5000000000    3                 6             0、1666666667    4                24             0、0416666667    5               120             0、0083333333    6               720             0、0013888889    7              5040             0、0001984127    8             40320             0、0000248016    9            362880             0、0000027557   10           3628800             0、0000002756                            続行するには何かキーを押してください、、、、、、 上のように実行結果が出るようにプログラミングしたいのですがわからないので 分かる方よろしくお願いします。 ちなみに今まで習ってきたのは、if文、switch文、do文、while文、for文なんですがこのプログラミングは、for文でおねがいします。 長文失礼しました。

  • C言語の授業で

    C言語の授業で -------------------- 3以上の整数を入力してください:10 素数は以下の数です: 7 5 3 2 素数は4個ありました -------------------- という感じの、入力した数以下の素数を表示するプログラムをwhile文を用いて作成するように言われたんですが・・・。 まず、while文と素数を表示するプログラムがよくわからないので、もう何をすればいいのか・・・。 どうか、ご教授お願いします。

  • C言語をなるべく早く教えてください

    C言語の問題集の回答がないので困っているので誰か教えてください。 私はまだ始めたばかりなので手におえません。 今私が理解しているif文、switch文、for文、while文、do-while文、配列、を 使用してでお願いします。 入力した行列を表示させるプログラムを作成しなさい。ただし、行列は任意に指定できるものにし、表示のさせ方にも気を付けること。 実行結果例1 N×M行列数を入力してください N=3 M=2 3×2行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 2行1列を入力して下さい 3 2行2列を入力して下さい 4 3行1列を入力して下さい 5 3行2列を入力して下さい 6 入力した3×2行列は次のようなものです 1.00 2.00 3.00 4.00 5.00 6.00 <実行結果例2> N×M行列数を入力してください N=3 M=4 3×4行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 1行3列を入力して下さい 3 1行4列を入力して下さい 4.23 2行1列を入力して下さい 5.1224 2行2列を入力して下さい 92.12 2行3列を入力して下さい 2.12 2行4列を入力して下さい 36.54 3行1列を入力して下さい 2.213 3行2列を入力して下さい 9.56 3行3列を入力して下さい 8 3行4列を入力して下さい 5.23153 入力した3×4行列は次のようなものです 1.00 2.00 3.00 4.23 5.12 92.12 2.12 36.54 2.21 9.56 8.00 5.23

  • 流れ図からプログラムに直してください!【C言語】

    その流れ図をC言語のプログラムに直してくれませんか? 処理2はscanf(..);って感じの内容です。 入口 処理1 for(処理2; 判断; 処理4){ 処理3 } 出口 って感じかなって思ったんですが、for文の中にscanfの文を入れてもいいのかわからずに悩んでます。 ループ文なのでwhile文、for文、do..while文のどれかかな?って思ったんですが違う気もして、わかるかたいらっしゃいませんか?

  • C言語について。

    今、C言語に関する問題をやっているんですが、いまいちわかりません。 その問題というのは↓ ≪問題5 (繰り返し) 例題をもとに、次のような九九の表を出力するプログラムを作成しなさい。  1 2 3 4  5  6  7  8  9  2 4 6 8 10 12 14 16 18  ~(略)                                               ≫ という問題です。それで、その例題というのは↓ ≪例題4 (for文、do while文)  次のプログラムは、入力された整数を一辺とする正方形を出力するプログラムである。動作確認をしなさい。  4       (←入力)  ****  (←出力)  ****  ****  **** /* 正方形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9);     for( i = 1 ; i <= hen ; i++)     {         for( j = 1 ; j <= hen ; j++)           printf("*");         putchar('\n');    } }  ≫ ≪例題5 (for文、do while文) 次のプログラムは、入力された整数を一辺とする二等辺三角形を出力するプログラムである。動作確認しなさい。  4      (←入力)  *     (←出力)  **  ***  **** /* 二等辺三角形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9 );     for( i = 1 ; i <= hen ; i++ )     {            for( j = 1 ; j <= i ; j++ )              printf("*");          putchar('\n');     } }  ≫ 以上の二つが例題です。 わかりづらかったらすみませんm(_ _)m わかる方(問題5を)教えてくださるとありがたいです。

  • C言語初心者です。

    C言語初めて壁にぶち当たりました。下の問題がとけません。よろしくお願いします。 標準入力から整数値を4個,int型の配列へ読み込んで,これかの値を大きい順に配列上で並び替え,出力するプログラムを作成してください。ただし,for文の2重ループを必ず使用してください。

専門家に質問してみよう