题目描述

  • 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字数字加减游戏_用例变成数字数字加减游戏_Math_02
  • 每个回台,小明可以用当前的数字加上或减去一个数字
  • 现在有两种数字可以用来加减,分别为
  • 其中数字数字加减游戏_整除_03没有使用次数限制
  • 请问小明最少可以用多少次数字加减游戏_整除_04,才能将数字数字加减游戏_用例变成数字数字加减游戏_Math_02
  • 题目保证数字数字加减游戏_用例一定能变成数字数字加减游戏_Math_02

输入描述

  • 输入的唯一一行包含四个正整数数字加减游戏_用例_09并且数字加减游戏_Math_10

输出描述

  • 输出的唯一一行包含一个整数,表示最少需要使用多少次数字加减游戏_整除_04才能将数字数字加减游戏_用例变成数字数字加减游戏_Math_02

用例

用例1

--输入
1 10 5 2
--输出
1
--说明
初始值 1 加上一次 a 变成 6,然后加上两次 b 变成 10,因此  a 的使用次数为 1


用例2

--输入
11 33 4 10
--输出
2
--说明
11 减两次 a 变成 3,然后加三次 b 变成 33,因此 a 的使用次数是 2 次

code + analysis

package com.hw;

import java.util.Scanner;

/**
 * desc :  <a href="https://fcqian.blog.csdn.net/article/details/128385337">数字加减游戏</a>
 * <p>
 * create time : 2023/7/24 10:20
 */
public class NumMaster {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int s = in.nextInt();
        int t = in.nextInt();
        int a = in.nextInt();
        int b = in.nextInt();

        numMaster(s, t, a, b);
    }

    /*   目标:将数字  s 变成 数字 t
     *        提供数字  a  b 可以来加减
     *        数字 b 没有使用次数限制
     *        求 最少用多少次数字 a,可以将数字 s 变成数字 t
     *
     * ex:   s = 1, t = 10, a = 5, b = 2
     *       s = 11, t = 33, a = 4, b = 10
     *
     * 那么可以这样考虑:假设不使用 a 的话,可不可以将 s 变成 t 呢?
     *                |- 首先可以得到 abs(s - t)  其是否可以 整除 数字 b
     *                使用一个数字 a,那么得到的差值 abs(s - t) - a  是否可以整除数字 b
     *                这里有一个变化,实际上应该是 加上/减去 若干个a,判断其是否可以整除数字 b
     */

    private static void numMaster(int s, int t, int a, int b) {
        // s t 的差值
        int diff = Math.abs(s - t);

        // 判断最多需要几个 a 可以满足条件
        int needA = (diff + a) / a;

        for (int i = 0; i < needA; i++) {
            // 加上若干个 a 或 减少若干个 a
            int add = (diff + i * a) % b;
            int up = Math.abs(diff - i * a) % b;
            if (add == 0 || up == 0) {
                System.out.println(i);
                break;
            }
        }
    }

}