移位游戲

題目描述

一天你正在玩一個(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));
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 算法口試也就是用自然語言描述算法,腦海中要有一個(gè)流程圖。 【目錄】考點(diǎn)一:循環(huán)考點(diǎn)二:遞歸考點(diǎn)三:排序考點(diǎn)四:查找...
    三金姐姐閱讀 820評(píng)論 -1 2
  • 51. 加法 不使用+、-,計(jì)算兩數(shù)字之和 52. 至少有K個(gè)重復(fù)字符的最長子串 找到給定字符串(由小寫字符組成)...
    毒死預(yù)言家的女巫閱讀 751評(píng)論 0 0
  • 1 選擇結(jié)構(gòu)if 1.1 if語句 ??在Java中,if語句的具體語法格式如下: ??上述格式中,判斷條件是一個(gè)...
    圣堂刺客_x閱讀 419評(píng)論 0 0
  • 1.鏈表 1.實(shí)現(xiàn)一個(gè)單向鏈表 2.找出鏈表相交節(jié)點(diǎn),假設(shè)均沒有環(huán) 3.判斷鏈表是否有環(huán)思路:使用快慢兩個(gè)指針,當(dāng)...
    X1028閱讀 730評(píng)論 0 0
  • AcWing第一講 基礎(chǔ)算法 本文題目及代碼全部來自AcWing,強(qiáng)推??!(因?yàn)闆]有接觸過C++所以一開始學(xué)起來不...
    Vooo閱讀 372評(píng)論 0 1

友情鏈接更多精彩內(nèi)容