腾讯笔试题之数字转换机

本文探讨了一种数字转换机的问题,该机器通过增加和翻倍操作将一对初始数值转换为目标数值。文章提出了一种策略,即优先考虑乘法操作以快速逼近目标,随后进行加法调整,以实现最小化操作次数的目标。通过递归算法,文章提供了解决方案并附带示例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

小Q从牛博士那里获得了一个数字转换机,这台数字转换机必须同时输入两个正数a和b,并且这台数字转换机有一个红色的按钮和一个蓝色的按钮:

当按下了红色按钮,两个数字同时加1。

当按下了蓝色按钮,两个数字同时乘2。

小Q现在手中有四个整数a,b,A,B,他希望将输入的两个整数a和b变成A,B(a对应A,b对应B)。因为牛博士允许小Q使用数字转换机的时间有限,所以小Q希望按动按钮的次数越少越好。请你帮帮小Q吧。

输入描述:

输入包括一行,一行中有四个正整数a,b,A,B,(1≤a,b,A,B≤10^9)。

输出描述:

如果小Q可以完成转换,输出最少需要按动按钮的次数,否则输出-1。

示例1

输入

100  1000  202  2002

输出

2

思路:乘法快,优先考虑乘法,然后加法,每次a,b小于A,B,再次递归,直至a==A,b==B或者a>A,b>B。

import java.util.Scanner;

public class Tencent01 {
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        String input = in.nextLine();
        String[] inputs = input.split(" ");
        int[] ins = new int[4];
        int times = -1;
        for (int i=0; i<4; i++){
            ins[i] = Integer.parseInt(inputs[i]);
        }

        if (ins[0]<1 || ins[0]>(10^9) || ins[0]>ins[2] || ins[1]<1 || ins[1]>(10^9) || ins[1]>ins[3] ||
                ins[2]<1 || ins[2]>(10^9) || ins[3]<1 || ins[3]>(10^9)){
            times = -1;
        } else {
            times = change(ins[0], ins[1], ins[2], ins[3]);
        }

        System.out.println(times);
    }

    public static int change(int a,int b,int A,int B){
        int time = 0;
        if (a == A && b == B){
            time = 0;
        } else {
            if (2*a < A && 2*b < B){
                time ++;
                time += change(2*a,2*b,A,B);
            }

            if (a+1 < A && b+1 < B){
                time ++;
                time += change(a+1,b+1,A,B);
            }

            if (a > A || b>B){
                time = -1;
            }
        }
        return time;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值