• ベストアンサー

2の累乗を計算するプログラムを作ったのですが・・・

C言語を用いて、2の累乗(2,4,8,16・・・)を 計算して表示するプログラムを #include<stdio.h> void main(void) { int i,s; s=1; for(i=1; i<=15; i++) { s=s*2; printf("i=%2d s=%7d\n",s); } } と打ち込んで実行したのですが、結果が i= 1 s= 2 i= 2 s= 4 i= 3 s= 8 i= 4 s= 16 i= 5 s= 32 i= 6 s= 64 i= 7 s= 128 i= 8 s= 256 i= 9 s= 512 i=10 s= 1024 i=11 s= 2048 i=12 s= 4096 i=13 s= 8192 i=14 s= 16384 i=15 s= -32768 のように、2の15乗だけが負になってしまいました。 最初のintをdoubleやfloatに直して実行すればよいのかとも考えたのですが、 実行すると答えがすべて0になってしまい上手くいきませんでした。 どの部分がおかしいのでしょうか・・・;

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

  • ベストアンサー
  • zone29
  • ベストアンサー率53% (71/133)
回答No.3

No2です。 追記ですが、printfの変換指定子は型にあわせたものを使わなければ正しく表示されません。 long であれば %ld にしてください。

参考URL:
http://ja.wikipedia.org/wiki/Printf
arg-rapid
質問者

お礼

重ねてありがとうございます。 intやlongばかりに目が行ってて、変換指定子まで目が行ってませんでした・・・; 実行してみたところ、 i= 1 s= 2 i= 2 s= 4 i= 3 s= 8 i= 4 s= 16 i= 5 s= 32 i= 6 s= 64 i= 7 s= 128 i= 8 s= 256 i= 9 s= 512 i=10 s= 1024 i=11 s= 2048 i=12 s= 4096 i=13 s= 8192 i=14 s= 16384 i=15 s= 32768 という結果を出すことができました。 ありがとうございます。

その他の回答 (2)

  • zone29
  • ベストアンサー率53% (71/133)
回答No.2

16Bitでの(signed)int型があらわせるのは -32768~32767 までです。 (signed)int型で15の二乗の32768はオーバーフローをして-32768になってしまいます。 unsigned int もしくは long を使用してください。

arg-rapid
質問者

お礼

オーバーフローは考えつきませんでした・・・。 さっそく実行してみます。 (実行中・・・) 答えて頂いたところ申し訳ないのですが、やはり改善しませんでした; unsigned intでもオーバーフローが起こってしまい、 longはNo.1の方と同様に答えが0になってしまいました・・・

回答No.1

WinXP Pro SP2 + bcc32で再現しない。 が、long intにすれば治るのではないか?(C言語系俺あまり経験無いし、再現確認してないが) http://www.st.rim.or.jp/~phinloda/cqa/cqa5.html#Q1 あと、その出力結果得るなら printf("i=%2d s=%7d\n",i,s); ではないか?

arg-rapid
質問者

お礼

回答ありがとうございます。 long intも試してみたのですが、 i= 1 s= 0 i= 2 s= 0 i= 3 s= 0 i= 4 s= 0 i= 5 s= 0 i= 6 s= 0 i= 7 s= 0 i= 8 s= 0 i= 9 s= 0 i=10 s= 0 i=11 s= 0 i=12 s= 0 i=13 s= 0 i=14 s= 0 i=15 s= 0 となってしまいました; これでは治らなかったようです・・・

arg-rapid
質問者

補足

出力結果の違いはご指摘の通りです; 乗数のiが表示されてた方がいいかな、と思って付け足したのですが、 書き忘れたようです、すいません。

関連するQ&A

  • 二次元配列の対各成分を書き出すプログラムについて

    実行結果が3,5,7を書き出すプログラムを作成したいです。1,5,9を書き出す(以下のプログラム)を書き出すものは出来たのですが、3,5,7を書き出すプログラムが解りません。誰か解る方、教えて下さい。 #include<stdio.h> int main(void){ int i,mt[3][3]= {{1,2,3}, {4,5,6},     {7,8,9}}; for(i=0;i<3;i++){ printf("%d",mt[i][i]); } printf("\n"); return(0); }

  • C言語 累乗の計算

    プログラミングの課題が出たのですが どうしても解けない問題が2問あったのでここで質問させてもらいます。 尚、私が書けた範囲で書いているので 根本的な間違えがありましたらご指摘ください。 「□」の部分がわかりません。 (1)任意の整数nを入力して4^nを計算するプログラミングを完成させよ #include <stdio.h> main(){ int i,n,x; i=1;x=1; printf("n="); schanf("%d",&n); while(i<=□){         x=4*□; i++; } printf("Answer=%d\n",x); } (2)e^xをテーラー展開したときのx^nの項の係数を求めるプログラミングを書け。 #include <stdio.h> main(){ int i,n; float x; printf("Input Nunber"); scanf("%d",&n); x=0 for(i=1;i<=n;i++){ x=□*x; } x=1/□; purintf("Answer%f\n",x); } 回答をお待ちしております。

  • 配列の和を求めるプログラム

    キーから入力したデータを配列に入力した後、その和を求めるプログラムを作成したいのですが、プログラミング初心者の私にはさっぱりわかりません。 和を求めたいのに平均値が出てきてしまいます。 どこが間違っているのか教えてください。 #include <stdio.h> float data[5]; float total(int max); void main(void) { int cnt = 0; float d; printf("please input a data: "); scanf("%f", &d); while((cnt < 5) && (d > 0.0)) { data[cnt] = d; cnt++; printf("please input a data: "); scanf("%f", &d); } printf("total data: %5.2f\n", total(cnt)); } float total(int max) { int i; float total = 0.0; for(i = 0; i < max; i++) { total += data[i]; } return total / max; }

  • 計算が合わない

    下のプログラムを実行したところ、1/3の計算結果が0.33333333333333331483になってしまいます。これはどこかプログラムが間違っているのでしょうか? #include<stdio.h> int main(int argc,char **argv){ double d; d=1.0/3.0; printf("%.20f\n",d); }

  • pow

    「1~10までの数、 その2乗、 その3乗」を10行出力するものです。 なぜか5^2 = 24 なってしまいました。なぜですか。お願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 3; j++) { printf("%4d ", (int)pow(i+1, j+1)); } printf("\n"); } return 0; }

  • C++の打切り誤差についてお聞きしたいのですが・・

    ↓のプログラムが、なぜ実行結果のsumが1ではなく1.000054や9.99999999999906e-001、9.9999999999990619e-001といった答えにになってしまうのでしょうか? 10000のところを512でやった場合は普通に1と出力されたのに・・・ #include <stdio.h> int main(void){ int i; float f; double d; f = 0.0; for(i = 0; i<10000; i++) { f += 1.0/10000; } printf("float: n=%d sum=%f\n", 10000, f); d = 0.0; for(i = 0; i<10000; i++) { d += 1.0/10000; }// end for printf("double:16.14e: n=%d sum=%16.14e\n", 10000, d); printf("double:18.16e: n=%d sum=%18.16e\n", 10000, d); return 0; } 実行結果 float: n=10000 sum=1.000054 double:16.14e: n=10000 sum=9.99999999999906e-001 double:18.16e: n=10000 sum=9.9999999999990619e-001 続行するには何かキーを押してください . . .

  • プログラムの中から別なプログラムを実行する

    現在、プログラムAを利用しています。プログラムAを何度も実行するようループ処理を加えたいのですが、インクルードファイルが行方不明になり、プログラムAのソースに手を加えてコンパイルすくことが出来なくなりました。 そこで、プログラムBを作り、その中からAを実行することでループさせたいのですが可能なのでしょうか?もし可能ならどのようにすればいいのか教えてください。よろしくお願いします。 プログラムAは次のようになっています。 #include <stdio.h> int avn; int nos; float fac; char fh[20]; void main(void){ printf(" input average number \n "); printf("0=>100,1=>200,2=>500,3=>1000 shots \n"); printf(" 10, 20, 50, 100 sec \n"); printf(" number = "); scanf("%d",&avn); printf(" number of records = "); scanf("%d",&nos); printf(" number / factor = "); scanf("%f",&fac); printf(" file head = "); scanf("%s",fh); printf("%d,%d,%f,%sが設定されました",avn,nos,fac,fh); } printf文の所には本来別の処理が入ります。

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • Borland C++を利用しているのですが、簡単なプログラムが実行できません。

    Borland C++を利用しているのですが、簡単なプログラムが実行できません。 以下のようなプログラムをコンパイルして実行しようとしたのですが... #include <stdio.h> void main(void) { int i,j,k; i=1; j=2; k=i+j; printf( "k=%d,k); } Borland C++は、初めて使うのですが、C言語の勉強には使えないのでしょうか? もし使えるなら、どのようにすればよいのでしょうか?

  • 書式制御'%d'と'%f'について

    以下のようなソースがあります。 実行すると、異常な、という処理において、 printf関数で、int型を'%f'で、処理すると 0.000000になります。 また、double型を'%d'で、処理すると 0になります。 これは何故、0になるのでしょうか。 説明できるかた、よろしくお願いいたします。 include <stdio.h> void main(){  int i;  double d;  i=100;  d=1.0;  printf("i=%d\n",i); /* 正常なprintf関数 */  printf("d=%f\n",d); /* 正常なprintf関数 */  printf("i=%f\n",i); /* 異常なprintf関数 */  printf("d=%d\n",d); /* 異常なprintf関数 */  return; }

専門家に質問してみよう