我们可以通过对一个整数 A 进行加1操作或者乘2操作使其转换为另一个整数 B 。
给出两个整数 X , Y ,计算至少需要多少步才能将 X 转换为 Y 。 .
输入的第一行包含一个整数 T (1 ≤ T ≤ 5 00 ),表示一共有 T 组测试数据。
每组测试数据占一行,包含两个整数 X , Y (1 ≤ X ≤ Y ≤ 10 18 )。
对于每组测试数据,输出至少需要多少步才能将 X 转换为 Y 。
3
1 1
3 10
2 11
0
3
4
对样例2的解释:只需3步即可将3转换为10: 3 -> 4 -> 5 -> 10 。
对样例3的解释:只需4步即可将2转换为11: 2 -> 4 -> 5 -> 10 -> 11 。
分析:
需用最少的步数将X转化为Y,则我们需要尽可能的多使用乘法,相应地,在这种步骤之下,由Y反推X则需尽可能地使用除法、不使用减法。在这个前提下我们列出必须使用减法的情况:
1.Y<2*X,即X>Y/2,这种情况下只能由Y做Y-X次减法得到X。
2.Y是一个奇数,显然,任何数乘2不可能等于一个奇数,因此在这种情况下需先Y-1得到一个偶数再做除法。
AC代码:
#include <cstdio>
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int t;
long long x,y;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
long long k=0;
scanf("%lld %lld",&x,&y);
while(x<y)
{
if(2*x>y)
{
k+=(y-x);
break;
}
else
{
if(y%2!=0)
{
k+=2;
}
else
k+=1;
y/=2;
}
}
printf("%lld\n",k);
}
return 0;
}