#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> cnt;
void timeofH(long H,long count,long n)
{
if(H==0)
{
cnt.push_back(count);
}else if(H>0)
{
if(H<n)
return;
timeofH(H-2*n,count+1,2*n);
timeofH(H-n,count+1,n);
}else
return;
}
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int T;
long H,count;
cin>>T;
for(int i=0;i<T;i++)
{
cin>>H;
timeofH(H,0,1);
sort(cnt.begin(),cnt.end(),cmp);
cout<<cnt[0]<<endl;
cnt.clear();
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> cnt;
int adjust(vector<int>& v,int size)
{
for(int i=size-1;i>0;i--)
{
if(!v[i-1])
{
v[i] -=1;
v[i-1]+=2;
}
}
int i=size-1;
while(!v[i--])
{
size--;
//注意此时size()大小并未改变
//v.empty();
//cout<<"此时数组大小为"<<v.size()<<endl;
}
bool flag=true;
int sum=0;
for(int i=0;i<size;i++)
{
if(v[i])
{
sum+=v[i];
}else
{
flag=false;
break;
}
}
if(flag)
return sum;
else
return adjust(v,size);
}
int main()
{
int T;
long H,count;
cin>>T;
for(int i=0;i<T;i++)
{
cin>>H;
while(H)
{
cnt.push_back(H%2);
H/=2;
}
//从最高位到最低位依次进位,确保数位上数字
//均大于0,此时数位数字和即为次数
cout<<adjust(cnt,cnt.size())<<endl;
count=0;
cnt.clear();
}//36=32+4=1+1+2+2+4+8+16
//001001
return 0;
}