编辑代码

// 设置标准输入接口
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// 问题描述:给定起点s和终点t,每次可以移动+a或-a或+b或-b步,求到达终点的最少操作次数
// 输入格式:一行四个整数 s t a b,分别表示起点、终点、第一种步长、第二种步长
// 输出格式:一个整数,表示最少需要的操作次数

void (async function () {
  // 读取输入并解构赋值为四个变量
  // s: 起点位置
  // t: 终点位置
  // a: 第一种移动步长
  // b: 第二种移动步长
  let [s, t, a, b] = (await readline()).split(" ").map(Number);

  // 特殊情况处理:如果起点到终点的距离能被b整除,说明只用b就能到达
  // 此时不需要使用a,操作次数为0
  if ((t - s) % b == 0) return console.log(0);
  else {
    // 计算起点到终点的距离
    const diff = t - s;
    // x表示使用第一种步长(a)的次数
    let x = 0;

    // 不断尝试使用不同次数的步长a,直到找到解
    while (true) {
      // 检查两种情况:
      // 1. diff - a*x 能被b整除:表示用x次a向左走,剩余距离用b可以到达
      // 2. diff + a*x 能被b整除:表示用x次a向右走,剩余距离用b可以到达
      if ((diff - a * x) % b == 0 || (diff + a * x) % b == 0) {
        // 找到解后输出使用a的次数
        console.log(Math.abs(x));
        return;
      }
      x++;
    }
  }
})();

// 示例说明:
// 输入:3 7 2 3
// 起点s=3,终点t=7,可以走2步或3步
// 过程:
// 1. 先检查 7-3=4 是否能被3整除,不能
// 2. 尝试使用一次步长2:
//    - 向右走2步:6到7的距离1不能被3整除
//    - 向左走2步:1到7的距离6能被3整除
// 3. 所以答案是1,表示使用一次步长2