编程语言
首页 > 编程语言> > [51node : 3216] [位运算] 授勋

[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;	
} 

标签:3216,51node,int,授勋,110,ans,对应
来源: https://www.cnblogs.com/unknown-future/p/15911887.html