[51node : 3216] [位运算] 授勋

3216 授勋

51nod 题目\(Link\)

题目解析

因为任意一个正整数都可以用 \(2\) 的幂次方表示,所以这道题有解。
所以把这个数转化为二进制时,每一位的 "\(1\)" 对应的的就是一个二的 \(n\) 次幂。
例: \(6\)(10) -> \(110\)(2)
\(6 = 2^1 + 2^2\)
\(110\) 对应的是 \(2\)\(1\)\(2\) 次幂。
所以对于一个二进制数,其第 \(i\) 位(从右往左数)所对应的是底数为 \(2\), 指数为 \(i~-~1\) 的幂。

然后考虑做法。
把所输入的数的 "1" 都用位运算删除,并且统计起来即可。

Code

#include <bits/stdc++.h>
using namespace std;

int n, ans;

int main ()
{
	scanf ("%d", &n);
	for (int i = 1; i <= n; ++ i) 
	{
		int t; ans = 0;
		scanf ("%d", &t);
		while (t)
		{
			ans += t & 1;
			t >>= 1;
		}
		printf ("%d\n", ans);
	}
	return 0;	
} 
posted @ 2022-02-19 09:04  unknown_future  阅读(30)  评论(0编辑  收藏  举报