二进制中1的个数


题目

给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。

输入格式
第一行包含整数n。第二行包含n个整数,表示整个数列。
输出格式
共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。

数据范围
1≤n≤100000,0≤数列中元素的值≤109

输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2

分析

这个题可以直接取模

#include<iostream>
using namespace std;

int main()
{
    int n,x;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        int ans=0;
        while(x)
        {
            if(x%2) ans++;
            x=x/2;
        }
        cout<<ans<<' ';
    }
    return 0;
}

也可以像这样用lowbit函数做

#include<iostream>
using namespace std;

int lowbit(int x)
{
    return x & -x;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int ans=0,x;
        cin>>x;
        for(int i=x;i;i-=lowbit(i)) ans++;
        cout<<ans<<" ";
    }
    return 0;
}

Author: 眼里有星星
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 眼里有星星 !
 Previous
区间和并 区间和并
题目给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。 输入格式第一行包含整数n。接下来n行,每行包含两个整数
2020-02-22
Next 
快速排序 快速排序
题目给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。 输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行
2020-02-22
  TOC