问题描述:
在显示着数字的坏计算器上,我们可以执行以下两种操作:
(1)双倍:将显示屏上的数字乘2;
(2)递减:将显示屏上的数字减1;
最初,计算器显示数字X。
返回显示数字Y所需的最小操作数。
示例1:
输入:X=2,Y=3
输出:2
解释:先进行双倍运算,然后再进行递减运算{2->4->3}
示例2:
输入:X=5,Y=8
输出:3
解释:先双倍,然后递减,再双倍{3->6->5->10}
示例3:
输入:X=1024,Y=1
输出:1023
解释:执行递减运算1023次
解题思路:
对于X来说,每次只有两种操作(减一和乘2),所以当X>=Y时,X只能通过不断的减一才能等于Y,执行操作的次数ans要增加X-Y次;当X<Y并且Y是偶数的话,使Y除2,Y是奇数的话Y+=1,最后统计步数。
int brokenCalc(int X, int Y) {
int num = 0;
while(X ^ Y){
if(X>Y){
num += X-Y;
Y = X;
}else{
if(Y&1) Y+=1,num++;
Y>>=1;
num++;
}
}
return num;
}