題目描述
一天你正在玩一個(gè)游戲,游戲給定一個(gè)數(shù)a,你需要通過一些簡單的移位操作來將其變成b,在每次操作中,你可以將當(dāng)前的數(shù)x變成以下六個(gè)數(shù)中的一個(gè):
x * 2, x * 4, x * 8(如果x被2整除),x / 4(如果x被4整除),x / 8(如果x被8整除)
例如,如果當(dāng)前的數(shù)x = 12,你可以將他變成24、48、96、6、3,你不能將其變成x / 8,因?yàn)?2不能被8整除。
現(xiàn)在請(qǐng)問將給定的初始值a通過上述操作變成目標(biāo)值b需要的最少的操作次數(shù)。
輸入描述
第一行包含一個(gè)正整數(shù)t(1≤t≤100),表示數(shù)據(jù)組數(shù)。
接下來你n行每行包括兩個(gè)空格隔開的正整數(shù)a和b,分別表示初始值和目標(biāo)值
輸出描述
輸出n行,每行一個(gè)數(shù)表示通過上述操作將初始值a變成目標(biāo)值b需要的最少的操作次數(shù),如果最終無法得到b,則輸出-1。
樣例輸入
4
3 6
16 2
12 4
1024 1
樣例輸出
1
1
-1
4
代碼
//測(cè)試環(huán)境 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));
}