我有这个程序来检查no是否为2的幂,但是如果no = 1099511627776
,它在测试用例上不起作用:
int not; // no of testcase
unsigned long long int no; // input number
int arr[100];
scanf ("%d", ¬);
for ( int i = 0; i < not; i++ )
{
scanf ("%llu", &no);
if ( no & !(no & (no - 1))) // check wheather no is power of 2 or not excludig 0
arr[ i ] = 1;
else
arr[ i ] = 0;
}
for ( int i = 0; i < not; i++ )
{
if ( arr[ i ] == 1 )
printf ("YES\n");
else
printf ("NO\n");
}
答案 0 :(得分:2)
出现错误是因为您将no
设为零的比较不是与&
运算符配合使用的良好逻辑表达式。
在一个值被单独使用的情况下,您可以避免这种情况,但是由于no
是2的幂,并且0
的最低有效位,因此no & [some-logical-expression]
的结果为零
您可以通过三种方式解决此问题:
&&
代替&
或no && !(no & (no - 1))
前面添加!!
,即no
或!!no & !(no & (no - 1))
。我非常喜欢第一种方法。
答案 1 :(得分:0)
&
是按位与。您需要逻辑AND:no && !(no & (no - 1))
。
答案 2 :(得分:0)
从您提到的代码来看,这是我的一些观察结果。
首先,如果用户给not
赋予的值大于100
怎么办?如果您将not>100
声明为arr
的大小100
,则会导致不确定的行为。为了避免这种情况,首先扫描not
,然后创建等于not
大小的数组。例如
int not = 0; // no of testcase
scanf ("%d", ¬);
int arr[not]; /* create array equal to not size.. */
或者像动态创建数组一样
int not = 0; // no of testcase
scanf ("%d", ¬);
int *arr = malloc(not * sizeof(*arr)); /* create dynamic array equal to not size.. */
其次,要检查给定的数字是否为2的幂,此!(no & (no - 1))
是正确的,但要排除zero
,即给定输入no
是否为{ {1}},那么您不应该选中0
。为此,请使用逻辑AND !(no & (no - 1))
运算符。这个
&&
应该是
if ( no & !(no & (no - 1))) {
}