題目
曆經曠日持久的戰争之後,百納瑞王國(The Kingdom of Binary)終于迎來了勝利的曙光。于是國王決定在勝利日這一天為在戰争中奮戰的将領們授勳。
已經需要為N位将領授勳,他們每人有一個功勳值p[i]。國王準備了不同種類的勳章,它們分别代表1,2,4,8,16…(即2的幂次)的功勳值。國王将用與每位将領功勳值對等數值的勳章授予他們,并且每位将領隻會被授予一枚同種勳章。
現在請你幫助國王算出,對于每一位将領,他需要準備多少枚勳章?
輸入
第一行輸入一個數N,表示将領人數;
之後N行,每行輸入一個數,分别表示每位将領的功勳值。
輸出
輸出N行,每行一個數表示需要授予該将領的勳章數。
資料範圍
對于20%的資料,2≤N≤10,1≤p[i]≤200;
對于50%的資料,2≤N≤1000,1≤p[i]≤500000;
對于100%的資料,2≤N≤100000,1≤p[i]≤10^9;
輸入樣例
3
15
1
22
輸出樣例
4
1
3
樣例解釋
樣例中,
第一位将領功勳值為15,授予8,4,2,1,共4枚勳章;
第二位将領功勳值為1,授予1,共1枚勳章;
第三位将領功勳章為22,授予16,4,2,共3枚勳章。
解題思路
由于組成勳章的權值都是 2 的幂,是以問題轉為求每個數的二進制表示中,有多少個 1。
代碼
#include <bits/stdc++.h>
#include<iostream>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include<cstring>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
#define INT_MAX 0x7fffffff
#define INT_MIN 0x80000000
typedef long long ll;
const int MOD = 1E9+7;
const int N = 100000+5;
using namespace std;
int a[N];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++){
int x,y = 0;
cin >> x;
while(x){
if(x%2==1){
y++;
}
x = x/2;
}
cout << y << endl;
}
return 0;
}