给定一个函数 f,满足:
从递推式看,每向右移一位(除以2),如果末位是1,就要在结果上乘2,否则不变。
因此,f(x) 正好等于
f(x)=2#{二进制表示中“1”的个数}.
记 popcount(x) 为 x 的二进制 1 的个数,则
f(x) = 2popcount(x).
既然如此,只要对每个 x 调用内建函数统计 1 的个数,然后左移即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int q;
cin >> q; // 读入询问次数 q
while (q--) {
unsigned int x;
cin >> x; // 读入当前查询的 x
// __builtin_popcount(x) 计算 x 的二进制中 1 的个数 c
// 1u << c 即 2^c
cout << (1u << __builtin_popcount(x)) << '\n';
}
return 0;
}
import sys
input = sys.stdin.readline
def main():
q = int(input()) # 读入查询次数 q
for _ in range(q):
x = int(input()) # 读入当前的 x
# bin(x) 返回形如 '0b1011' 的字符串,count('1') 即统计其中 '1' 的个数
c = bin(x).count('1')
# 1 << c 相当于 2**c,正好是 2 的 c 次幂
print(1 << c)
if __name__ == "__main__":
main()
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int q = Integer.parseInt(in.readLine()); // 读入查询次数 q
while (q-- > 0) {
int x = Integer.parseInt(in.readLine());
// Integer.bitCount(x) 直接返回 x 的二进制表示中 1 的个数
int c = Integer.bitCount(x);
// 1 << c 即将 1 左移 c 位,得到 2^c
System.out.println(1 << c);
}
}
}
定义函数 f(x)满足以下递归关系: 1.f(0)=1;
2.对于任意非负整数n,有f(2n)=f(n);
3.对于任意非负整数n,有f(2n+1)=f(n)×2
现给定若干次询问,每次询问一个非负整数x,请你计算f(x) 的值.
第一行输入一个整数 q(1≦q≦105),表示询问的次数
接下来q行,每行输入一个非负整数x(0≦x≦109),表示一次询问。
对于每个询问,输出一行一个整数,表示f(x)的值.
输入
3
0
1
3
输出
1
2
4
对于x=0,由定义有f(0)=1。
对于x=1,可以表示为2⋅0+1.故
对于x=3,可以表示为2⋅1+1,故
输入
2
2
7
输出
2
8
对于x=2,可以写作2×1,故
对于x=7,可以写作2⋅3+1且