解法一
利用lowbit
lowbit的实现原理(原码,反码,补码)
正数:原码=反码=补码 符号位为0
负数:反码=对原码取反 补码=反码+1 符号位为1
Eg q=15(十进制) -> 01111(二进制)
-q=-15 -> 11111(二进制)
-q=反码+1=00000+1=00001
q & (-q) = 1
#include<iostream>
using namespace std;
int lowbit(int q)//当返回低位值含1时,当且仅有一个1
{
return q&(-q);
}
int main()
{
int n;
cin>>n;
while(n--)
{
int q;
int length=0;
cin>>q;
while(q) q-=lowbit(q),length++;
cout<< length<<" ";
}
return 0;
}
解法二
利用取n的第k位的二进制数模版:n>>k&1
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
int n,q=0;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
q=0;
for(int j=31;j>=0;j--)
if(a[i]>>j&1) q++;
cout<<q<<' ';
}
return 0;
}
两个时间复杂度分别是多少
都是一样的$O(m \ast n)$,n为个数,m为数的位数
计算量大概:3 $\ast 10^6$级别吧,不会$\color{red}{TLE}$