#include<stdio.h>
#include <stdlib.h>
int main()
{
long long int a;
int flag = 0;
scanf("%lld", &a);
if (a > 0)
{
while (a > 0)
{
if (a % 2 == 0 || a == 1)
{
a = a / 2;
flag = 1;
}
else
{
flag = 0;
break;
}
}
}
if (a < 0)
{
while (a <= -1)
{
if (a % 2 == 0 || a == -1)
{
a = a / 2;
flag = 1;
}
else
{
flag = 0;
break;
}
}
}
if (flag == 1)
{
printf("yes");
}
else
{
printf("no");
}
}
给出整数N,程序必须确定它是2还是-2的幂。如果N是2或-2的幂,则程序必须打印yes。否则程序必须打印编号。
边界条件:
-10^17 <= N <= 10^17
输入格式:
第一行包含N
的值。
输出格式:
第一行包含yes
或no
对于输入-4503599627370496
,它应该打印no
,但它打印yes
。解决方案,请
答案 0 :(得分:0)
如果是负数,还应该计算2的幂。如果是这样,它将无法正常工作。将-2
赋予52
的幂,以4503599627370496
代替-4503599627370496
。
下面的代码使用按位移位运算符解决了这个难题:
#include <stdio.h>
#include <stdlib.h>
int main()
{
long long int a, aPositive, l = 1;
scanf("%lld", &a);
aPositive = a > 0 ? a : -a;
int count = 0;
while (l < aPositive)
{
l = l << 1;
count++;
//printf("%d\t%lld\n", count, l);
}
if (l == aPositive && (a > 0 || count % 2 == 1))
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
答案 1 :(得分:0)
这里已经解决了非常类似的问题:how-to-check-if-a-number-is-a-power-of-2
bool IsPowerOfTwo(long long x)
{
return (x != 0) && ((x & (x - 1)) == 0);
}
int main()
{
bool result = IsPowerOfTwo(256);
if (result )
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}