- ベストアンサー
基本的に問題
C言語の勉強を最近始めた大学生です。 読み込まれた整数値以下である正の2のべき乗の数を昇順に表示するプログラムを作成せよ。 例えば19と入力すると、2 4 8 16 と表示される。 という問題を解いていたのですが。 #include<stdio.h> int main (void) { int i,no; printf("正の整数を入力してください:"); scanf("%d",&no); i=1; while(i*i<=no) printf("%d",i*i); i+=1; putchar('\n'); return(0); こう書いてみてコンパイルしてみると。 1が永遠に表示されてしまうのですが。。 どこが間違っているか、指摘してください。 よろしくお願いしますm( __ __ )m
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>正の2のべき乗の数を昇順に表示するプログラムを作成せよ ですよ。 1の方の指摘はもちろんですが、そのほか、 while(i*i<=no) printf("%d",i*i); これでは、平方数になってしまいます。 Cにはべき乗演算子がありませんので、どこかで int power2( int x ); みたいなのを定義しておき、 int i2; while( i2 = power2( i ) <= no ) { printf("%d",i2); . . . みたいな感じで。
その他の回答 (2)
- mac_res
- ベストアンサー率36% (568/1571)
#include <stdio.h> int main(void) { int i, no; char buf[BUFSIZ]; while(1) { printf("正の整数を入力してください:"); if (fgets(buf, BUFSIZ, stdin) != 0 && sscanf(buf,"%d", &no) == 1) break; } i = 2; while (no >= i) { printf("%d ", i); i <<= 1; } printf("\n"); return(0); }
- kaZho_em
- ベストアンサー率50% (2950/5879)
>while(i*i<=no) >printf("%d",i*i); >i+=1; >putchar('\n'); >return(0); あなたのお書きになったソースでは、以下と同じ意味になるからです。 while(i*i<=no){ printf("%d",i*i); } i+=1; putchar('\n'); return(0); { } でループ範囲を明示的に書かなかった場合、直後の一行のみがループ範囲と 見なされます。 すなわち、printf文が永久ループで実行され、それ以降が実行される事はありません。