#include
#include
using namespace std;
int main() {
unsigned long long int n;
cin>>n;
double a=log(n)/log(2);
double b=floor(a);
if(a-b!=0)
cout<<"NIE"<<endl;
else
cout<<"TAK"<<endl;
}
Getting Wrong Answer for the above code.
Constraints:
n<=10^14
Try this code.
Logic is: a number which is power of 2 form has only one β1β in its binary representation.
For example:
2 = 10
4 = 100
8 = 1000
16 = 10000
and numbers which are not of 2 power form contain more than one β1β in their binary representation
For example:
3 = 11
5 = 101
7 = 111
10 = 1010
And your code does not work because there are precision issues in using double like when dividing when may lose some bits. And also never try to compare two double values. Why? Discussed here.
Another way: mentioned by @rjohari and @lebron
If bitwise AND (&) of number βNβ and βN-1β is zero then , βNβ is of power 2 form otherwise not.
if((n&(n-1))==0)
cout<<n<<" is power 2 form"<<endl;
else
cout<<n<<" is not power 2 form<<endl;
For example:
n = 8 , in bit representation 8=1000
n-1 = 7 , in bit representation 7=0111
1000 & 0111 = 0000
n = 4 , in bit representation 4=100
n-1 = 3 , in bit representation 3=011
100 & 011 = 000
n = 7 , in bit representation 7=111
n-1 = 6 , in bit representation 6=110
111 & 110 = 110
1 Like
your code will produce error integer constant is too large for βlongβ type on large inputs.
Alternate solution: Use bitwise and to check if number is power of 2 or not. If a number N is power of 2 then bitwise and of N and N-1 is zero.