入力した数が2の累乗根かどうか調べるプログラムを作りました。

補足

入力するこ数字は0より大きい整数でお願いします。

C言語関連75閲覧

ベストアンサー

1

1人がナイス!しています

その他の回答(3件)

1

#include<stdio.h> int main(void) { int n; scanf("%d",&n); while(n!=1){ if(n%2==0)n/=2; else break; } if(n==1)printf("OK\n"); else printf("NG\n"); return 0; } 問題点は0を入力すると無限ループになる。 1を入力するとOKになる。 だから、動作条件として2以上の入力をすること。 動作条件を付けるのは普通です。2の100乗なんて処理できませんので、、、 ステップ数は増えるが、、、 #include<stdio.h> int main(void) { int n,k; printf("==>"); scanf("%d",&n); if(n<2){ printf("NG\n"); return -1; } k=0; while(n!=1){ if(n%2==0){ n/=2; k++; }else break; } if(n==1)printf("OK 2の%d乗です。\n",k); else printf("NG\n"); return 0; }

1人がナイス!しています

1

とりあえず、unsigned なら、 立っているビットが 1 個であれば、2の累乗なので、 int popcount(unsigned int n) { unsigned add, nn; add = nn = n>>1; while(nn>>=1) add += nn; return n - add; } で、1が帰ってくればOKにすればいいと思います。

1人がナイス!しています

1

累乗根じゃなくて累乗ですね。 後半mに2を掛けていって確認してる部分は不要では? NGに該当しなければOKなはずです。

1人がナイス!しています