题目描述
一天你正在玩一个游戏,游戏给定一个数a,你需要通过一些简单的移位操作来将其变成b,在每次操作中,你可以将当前的数x变成以下六个数中的一个:
x * 2, x * 4, x * 8(如果x被2整除),x / 4(如果x被4整除),x / 8(如果x被8整除)
例如,如果当前的数x = 12,你可以将他变成24、48、96、6、3,你不能将其变成x / 8,因为12不能被8整除。
现在请问将给定的初始值a通过上述操作变成目标值b需要的最少的操作次数。
输入描述
第一行包含一个正整数t(1≤t≤100),表示数据组数。
接下来你n行每行包括两个空格隔开的正整数a和b,分别表示初始值和目标值
输出描述
输出n行,每行一个数表示通过上述操作将初始值a变成目标值b需要的最少的操作次数,如果最终无法得到b,则输出-1。
样例输入
4
3 6
16 2
12 4
1024 1
样例输出
1
1
-1
4
代码
//测试环境 node模式
let readlineSync = require('readline-sync');
readlineSync.setDefaultOptions({ prompt: '' })
let readline = readlineSync.prompt
let minOperation = (a, b) => {
let count = 0;
while(true) {
if(a === b) {
return count;
}
if(b > a) {
if(a * 8 <= b) {
a *= 8;
count++;
} else if(a * 4 <= b) {
a *= 4;
count++;
} else if(a * 2 <= b) {
a *= 2;
count++;
} else {
return -1;
}
} else {
if(a % 2 !== 0) {
return -1;
} else if(a % 8 === 0 && a / 8 >= b) {
a = parseInt(a / 8);
count++;
} else if(a % 4 === 0 && a / 4 >= b) {
a = parseInt(a / 4);
count++;
} else {
a = parseInt(a / 2);
count++;
}
}
}
}
let t = readline();
while(t--) {
let data = readline().split(" ");
let a = parseInt(data[0]);
let b = parseInt(data[1]);
console.log(minOperation(a, b));
}