当前位置: 首页 > article >正文

位运算:进制

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<bits/stdc++.h>
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;

}


http://www.kler.cn/a/230898.html

相关文章:

  • dolphinscheduler海豚调度(一)简介快速体验
  • 基于51 单片机的交通灯系统 源码+仿真+ppt
  • 改变AI服务器:探索界面互连芯片技术的创新突破
  • yolov8使用旋转框自己做数据集检测
  • python 多趟算法举例
  • MySQL:从基础到实践(简单操作实例)
  • MySQL学习记录——사 表结构的操作
  • C++俄罗斯方块 -- 菜单展示和选择 -- 方法
  • 前端代码评审规范
  • 关于自动驾驶概念的学习和一些理解
  • docker 入门教程
  • 假期作业 2月6号
  • 【软件设计师笔记】普及软件知识产权中的著作权保护
  • TryHackMe-Vulnerability Capstone练习
  • 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测
  • 1.0 Zookeeper 分布式配置服务教程
  • c++设计模式之装饰器模式
  • 24炸了,计算机跨考还有可行性吗?
  • idea开发工具的简单使用与常见问题
  • COMSOL接触(高度非线性)仿真常见报错及解决方法总结