51nod 题目\(Link\)
因为任意一个正整数都可以用 \(2\) 的幂次方表示,所以这道题有解。
所以把这个数转化为二进制时,每一位的 "\(1\)" 对应的的就是一个二的 \(n\) 次幂。
例: \(6\)(10) -> \(110\)(2)
\(6 = 2^1 + 2^2\)
\(110\) 对应的是 \(2\) 的 \(1\) 和 \(2\) 次幂。
所以对于一个二进制数,其第 \(i\) 位(从右往左数)所对应的是底数为 \(2\), 指数为 \(i~-~1\) 的幂。
然后考虑做法。
把所输入的数的 "1" 都用位运算删除,并且统计起来即可。
#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; }