プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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);
.
.
.
みたいな感じで。
    • good
    • 0

#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);
}
    • good
    • 0

>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文が永久ループで実行され、それ以降が実行される事はありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!