• ベストアンサー

二進数にするプログラム

C言語の問題なんですが、なかなかできません。 途中までやったんですがこれからどうすればいいか分かりません。 1、まず、整数をどんどん入力し、最後に負の数を入力する。負の数が入力されると、これまで入力された数を逆順で表示するプログラムを作成する。 2、1でできたものを利用して、何か数字が入力されたら、それを二進数に直すプログラムを作成する。ただし、二進数の桁数は1000桁以内とする。 ここまでやったんですがこれからどうすればいいか分かりません。 どなたか知恵を貸してくれませんか? #include<stdio.h> int main() { int z[1000],Z,i; printf("正の整数を入力してください:\n"); for(i=0;1<1000;i++); { scanf("%d",&z[i]); if(z[i]<0) break; } Z=i; for(i=0;i<Z/2;i++) { int temp=z[i]; z[i]=z[Z-1-i]; z[Z-1-i]=temp; } printf("入力した要素を逆順に並べると:\n"); for(i=0;i<Z;i++) printf("%d\n",z[i]); return(0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • peeea
  • ベストアンサー率57% (31/54)
回答No.6

問1については他の方々がすでに回答されているので問2について答えます。 参考URLの下の方にある「10進数 → 2進数」の項目の図を見れば なぜ逆順表示する必要があるかという問題の意図がイメージしやすいと思います。 c = a % b; とすればa÷bの余りが求められます。 aを整数型で宣言して d = a / b; とすればa÷bの商が求められます。 これらをfor文でループすればできると思います。 説明が下手ですみませんが、わからなければ言って下さい。

参考URL:
http://www.ne.jp/asahi/license/ikawa17/info_kiso/bin.html
bad-pc
質問者

お礼

こうゆう感じでもいんでしょうか? #include <stdio.h> int main(void) { int n[1000], dec, i; printf("正の整数を入力してください"); scanf("%d", &dec); i = 0; do{ n[i ++] = dec & 1; dec >>= 1; }while(i < 1000 && dec > 0); while(i --) printf("%d", n[i]); return 0; }

その他の回答 (6)

  • peeea
  • ベストアンサー率57% (31/54)
回答No.7

No.6です。 新しく記入されたプログラムは、No.2さんの回答内容に沿っていますね。 こちらの方がすっきりしていて見やすいと思いました。 ただ、学校や研修の課題として提出するのであれば 1番のプログラムを利用して2番を解くのが一般的です。 もしくは2番のやり方で1番のプログラムを書き直すのもいいでしょう。 趣味としてプログラムをするのであれば色々なやり方で書くのは 勉強になるのでこのままでいいと思います。

noname#50176
noname#50176
回答No.5

修正してみると恐らくこんな感じです。 #include <stdio.h> int main() { int len[1000],z[1000],n,i,j; char m[1000][1000]; printf("正の整数を入力してください:\n"); for(i=0;i<1000;i++) { scanf("%d",&z[i]); if(z[i]<0) break; j=0,n=z[i]; while (j<1000 && (m[i][j++]=(n||!j)?(n&1)+48:0)) n>>=1; len[i]=j-1; } printf("入力した要素を逆順に並べると:\n"); for(--i;i+1;i--) { printf("%d [10進] >",z[i]); for (j=len[i];j+1;j--) printf("%c",m[i][j]); printf(" [2進]\r\n"); } return(0); } for(i=0;1<1000;i++); は、for(i=0;i<1000;i++) ですね。 1000桁と言うのは、2の(1000-1)乗桁ということですから 入力個数が1000個ではないかと思いますが、とりあえず 1000個までの条件のしましたが・・・。 因みに主流の32ビットでは1000桁は無理です。

bad-pc
質問者

お礼

自分はプログラミングが苦手なんでなかなかできないんですが、参考にさせてもらいますね。

  • hilow1
  • ベストアンサー率53% (7/13)
回答No.4

2進変換は#2さんが述べておられるようにシフトとANDで実装するのが 普通ですが、参考としてより簡単(人間的?)なほうを。 手計算で2進変換する方法を知っていますか? たとえば10進数の10を2進変換する場合、 10/2 = 5 余り 0 5/2 = 2 余り 1 2/2 = 1 余り 0 1/2 = 0 余り 1 このように商が0になるまで商の除算を繰り返していきます。 最終的に余りを逆順に並べたもの、つまり1010が2進変換した値になります。 この逆順に並べるという作業に、問1で実装したものを利用すればよいです。

bad-pc
質問者

お礼

手計算で2進変換する方法はわかるんですが、問1を使ってどのようにすればいいかわからないんですよね。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

「逆順」の定義は何ですか?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

とりあえず2進表示のヒント。 シフト演算、AND演算。とループを組み合わせる。

noname#77845
noname#77845
回答No.1

とりあえず、逆順に表示させるには6行目のFOR文の後の「;」がいりません。

関連するQ&A