你可以先做一个预处理。例如说有一个a数组,a[n]为1表示n是2的幂,否则不是
那么你在初始化的时候a数组整个就是全为0的
然后
int p = 1;
for (int i=0; i<=31; ++i) //这里根据你要的数据量大小决定,这里是有符号的
{
a[p] = 1;
p <<= 1;
}
ok,预处理只做了32次赋值和32次位移而已。接下来对于任意输入的N,
你只要直接输出a[N]。这是O(1)的
所以我认为,这是很快的一种做法
//以上是算法方面的问题
我仔细看了你的提问之后我发现你的问题应该是在对输入数据的处理方面。推荐你做
杭电上所有的a+b problem还有输入输出处理的题目(1089~1096)
例如说这一题,你应该这样
int n;
scanf("%d", &n);
while ( n-- )
{
int N;
scanf("%d", &N); //这个才是被询问的数
....
}
#include
int main(){
int g,N;
int i;
scanf("%d",&g);
for (i=0;i
while(N%2==0) N=N/2;
if (N==1) printf("1\n"); else printf("0\n");
}
return 0;
}
=================
你的输入输出例子有点问题。
2 应当是组数,输出 时 怎么 把 2 也作为 一个 数据 判断它是否是2 的幂了?
如果确实有此要求,你就把 g 也判断和输出一次。
ACM题目吧,很简单
#include
void main()
{
int N;
while (scanf("%d",&N)!=EOF)
{
while (N%2==0)
{
N/=2;
}
if(N==1) printf("1\n");
else
printf("0\n");
}
}
bool ans(int n)
{
while(n&&n%2==0)
n/=2;
if(n)return false;
return true;
}
淡淡的的顶顶顶顶顶的顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶