原问题要求从坐标 x 移动到坐标 y(x≤y),每次可以向右移动一个 2 的幂次(即 1,2,4,8,…),求最少操作次数。
popcount)。在一条无限长的整数数轴上,你初始位于坐标 x 处,目标坐标是 y(保证 x≤y)。每一次操作,你可以选择一个非负整数 k(k≥0),并向右移动恰好 2k 单位距离。换言之,每一步可以走的距离为 1,2,4,8,…。你需要计算从 x 移动到 y 所需的最少操作次数。
保证测试数据组数 T 不超过 105,坐标满足 −1018≤x≤y≤1018。
第一行包含一个整数 T,表示数据组数。接下来 T 行,每行包含两个整数 x 和 y,用空格分隔,分别表示起点坐标和目标坐标。
对于每组数据,输出一行一个整数,表示从 x 到 y 的最少操作次数。
输入
3
-10 0
7 7
4 11
输出
2
0
3
说明
第一组数据:起点为 -10,终点为 0,差值为 10,其二进制表示为 1010,包含 2 个 1,因此最少需要 2 次操作(例如依次移动 23=8 和 21=2)。
第二组数据:起点与终点均为 7,差值为 0,二进制中 1 的个数为 0,不需要任何操作。
第三组数据:起点为 4,终点为 11,差值为 7,二进制表示为 111,包含 3 个 1,需要 3 次操作(例如依次移动 22=4、21=2 和 20=1)。
输入
2
-3 5
0 1023
输出
1
10
说明
第一组数据:起点为 -3,终点为 5,差值为 8,其二进制表示为 1000,仅包含 1 个 1,因此只需 1 次操作,直接移动 23=8 即可。
第二组数据:起点为 0,终点为 1023,差值为 1023。由于 1023=210−1,其二进制表示由 10 个 1 组成,因此最少需要 10 次操作(依次使用 29,28,…,20 各一次)。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册