位运算
#include<iostream>
using namespace std;
int wei(int n)
{
return (n&-n);
}
int main()
{
int t,n,s;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int l=0;
while(1)
{
if(wei(n)==n)
break;
l++;
n=n+wei(n);
}
printf("%d\n",l);
}
}
常规做法
#include<stdio.h>
#include<string.h>
int e[50];
int aa[33]={1,2,4,8,16,32,64,128,256,512,1024,2048,
4096,8192,16384,32768,65536,131072,262144,524288,1048576,
2097152,4194304,8388608,16777216,33554432,67108864,
134217728,268435456,536870912,1073741824};
int main(void)
{
int t,n,i,l,flag;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
memset(e,0,sizeof(e));
scanf("%d",&n);
flag=0;
for(l=0;;l++)
{
for(i=0;i<32;i++)
{
if(n==aa[i])
flag=1;
}
if(flag) break;
int nn; nn=n;
for(i=0;nn!=0;i++)
{
e[i]=0;
e[i]+=nn%2;
nn=nn/2;
}
int ans=1;
for(i=0;e[i]!=1;i++) ans=ans*2;
n+=ans;
}
printf("%d\n",l);
}
}
}