Java教程

[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;	
} 
这篇关于[51node : 3216] [位运算] 授勋的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!