位运算:进制

4982. 进制 - AcWing题库 

给定两个整数 a,b

请你计算,在 [a,b] 范围内有多少个整数满足其二进制表示恰好有一个 0。

不考虑前导 0。

例如,当 a=5,b=10 时,[5,10]范围内的所有整数及其二进制表示如下:

可以看出,只有 5 和 6 满足二进制表示恰好有一个 00。

输入格式

共一行,两个整数 a,b。

输出格式

一个整数,表示满足条件的整数数量。

数据范围

前 66 个测试点满足 1≤a≤b≤104。
所有测试点满足 1≤a≤b≤1018。

输入样例1:
5 10
输出样例1:
2
输入样例2:
2015 2015
输出样例2:
1
输入样例3:
100 105
输出样例3:
0

 

根据题意,数据范围过大,无法枚举 a~b 计算,但 1e18 的数肯定不超过2的64次方,所以可以枚举从 1 到 2 的64次方中所有二进制表示中所有数都是 1 的数,然后依次枚举计算0不位于首位的情况下的数是多少,则可以计算出所以合法的数,然后判断是否在a-b之间就可以了

AC code:

#include
using namespace std;
long long a, b;
long long arr[100010];
int main() {

	cin >> a >> b;
	long long ans = 0;
	int index = 0;
	for (int i = 1; i < 63; i++) {
		long long x = 1;
		int j = 1;
		while (j <= i) {
			x = x << 1;
			x++;
			j++;
		}
		for (int u = 1; u <= i; u++) {
			long long c = 1;
			c = c << (u - 1);
			long long f = x;
			f = f ^ c;
			arr[index++] = f;
		}
	}
	for (int i = 0; i < index; i++) {
		if (a <= arr[i] && b >= arr[i]) ans++;
	}
	cout << ans;

}

你可能感兴趣的:(算法,数据结构,c++,位运算,数论)