天天看點

51nod 3216 授勳

題目

曆經曠日持久的戰争之後,百納瑞王國(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;
}