这道题比较有意思
一开始按照正常逻辑敲完代码
```c
#include<stdio.h>
#include<string.h>
//#include<algorithm>
//using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int left,right;
scanf("%d %d",&left,&right);
int f=0;
for(int i=left; i<=right; i++)
{
int temp=i;
int cishu=0;
while(temp)
{
int k=temp%2;
if(k==1)
cishu++;
if(cishu==2)
break;
temp/=2;
}
if(cishu==1)
{
f=1;
printf("%d\n",i);
break;
}
}
if(!f)
printf("-1\n");
}
return 0;
}
分分钟超时,这还是优化了一点点后的代码 ,应该是由于测试组数太多 再遍历就很容易超时
又试了试快速判断二次幂的方法 还是超时。。。
快速判断二次幂
int num;
scanf("%d",&num);
if(num&num-1)
printf("NO\n");
else
printf("YES\n");
最后试了试只判断第一个数 找出二进制位数输出 然后就才过 罚时3次 枯了
```c
#include<stdio.h>
#include<string.h>
int mi(int n )
{
int sum=1;
while(--n)
{
sum*=2;
}
return sum;
}
int main()
{
int n;
//printf("请输入测试组数:\n");
scanf("%d",&n);
while(n--)
{
int left,right;
//printf("请输入测试区间:\n");
scanf("%d %d",&left,&right);
//int f=0;
int num=0;
int temp=left;
while(temp)
{
temp/=2;
num++;
}
int nu=mi(num);
if(nu>=left)
{
printf("%d\n",nu);
continue;
}
else if(nu<left&&nu*2<=right)
{
printf("%d\n",nu*2);
continue;
}
printf("-1\n");
}
return 0;
}