这个题有多种解法,
比如可以使用归并思路求每个数的二进制中每n(eg.n=4/8)位包含1的个数,再相加求和。
当然另外一种思路是,一个数二进制中1的个数是它除去最高位那个1之后1的个数再➕1(因为2^n的二进制只有最高位为1)。
比如7的二进制表示为:111(100+011),其中1的个数为1➕011中1的个数,即f(7) = 1+f(3)。
代码:
#include<iostream>
#include<vector>
using namespace std;
void numOfBit1(int n, vector<int>& a) {
int high = 0;
for (int i = 1; i <= n; i++) {
if (i & (i-1)) {
a.push_back(1 + a[i - high]);
} else {
high = i;
a.push_back(1);
}
}
}
int main() {
int n = 10;
vector<int> a;
numOfBit1(n, a);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
}
输出:
1 1 2 1 2 3 2 1 2 3