Проверка на степень двойки

Дано натуральное число N. Вывести слово "YES", если N является числом, которое получается при возведении 2 в какую-либо степень, и слово NO в противном случае.

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int N, i=0, J=0;
    cin>>N;
    while(pow(2.0,i)!=N)
    {
        J=pow(2.0,i);
        i++;
    }
    if(J==N)
    {
        cout<<"YES";
    }
    else if(J!=N)
    {
        cout<<"NO";
    }       

    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Конечно, ваш код можно попытаться исправить как

int main()
{
    int N, i=0, J=0;
    cin>>N;
    while(pow(2.0,i)<=N)
    {
        J=pow(2.0,i);
        i++;
    }
    if(J==N)
    {
        cout<<"YES";
    }
    else
    {
        cout<<"NO";
    }
}

Но смысла в этом нет. Поскольку, если точно натуральное, т.е. нулем быть не может, то достаточно этого:

unsigned int N;
cin >> N;
cout << (N&(N-1) ? "NO" : "YES");

И вообще, не надо привлекать вычисления с плавающей точкой туда, где нужна целочисленная арифметика.

Намек: степень двойки в бинарной записи имеет вид 0..010..0, словом, с единственной единичкой внутри...

→ Ссылка