【华为OD-E卷 - 数字加减游戏 100分(python、java、c++、js、c)】
题目
小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字s变成数字t。
每个回合,小明可以用当前的数字加上或减去一个数字。
现在有两种数字可以用来加减,分别为a,b(a!=b),其中b没有使用次数限制。
请问小明最少可以用多少次a,才能将数字s变成数字t。
题目保证数字s一定能变成数字t。
输入描述
- 输入的唯一一行包含四个正整数s,t,a,b(1<=s,t,a,b<=10^5),并且a!=b
输出描述
- 输出的唯一一行包含一个整数,表示最少需要使用多少次a才能将数字s变成数字t
用例
用例一:
输入:
1 10 5 2
- 1
输出:
1
- 1
用例二:
输入:
11 33 4 10
- 1
输出:
2
- 1
python解法
- 解题思路:
# 读取输入:初始值 s,目标值 t,步长 a 和 b
s, t, a, b = map(int, input().split())
def getResult(s, t, a, b):
"""
计算从 s 到 t 所需的最小 x,使得 (t - s - a * x) 或 (t - s + a * x) 是 b 的倍数。
"""
x = 0 # 初始化 x 为 0
# 计算目标差值
diff = t - s
# 枚举 x,直到找到满足条件的 x
while ((diff - a * x) % b != 0 and (diff + a * x) % b != 0):
x += 1 # 增加 x 的值
# 返回满足条件的 x
return x
# 输出结果
print(getResult(s, t, a, b))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
java解法
- 解题思路
import java.util.*;
public class Main {
public static void main(String[] args) {
// 获取输入
int[] input = getInput();
// 计算最少使用a的次数
int result = computeMinAUsage(input[0], input[1], input[2], input[3]);
// 输出结果
printResult(result);
}
/**
* 获取输入
* @return 包含 s, t, a, b 的数组
*/
private static int[] getInput() {
Scanner sc = new Scanner(System.in);
int[] arr = new int[4];
for (int i = 0; i < 4; i++) {
arr[i] = sc.nextInt(); // 依次读取 s, t, a, b
}
return arr;
}
/**
* 计算最少使用 a 的次数
* @param s 初始值
* @param t 目标值
* @param a 每次步长 a 的值
* @param b 每次步长 b 的倍数
* @return 最少使用 a 的次数
*/
private static int computeMinAUsage(int s, int t, int a, int b) {
int cnt = 0; // 初始化使用 a 的次数
int dif = t - s; // 计算目标差值
// 不断增加 cnt 的值,直到满足条件
while (true) {
// 检查是否满足条件
if ((dif - a * cnt) % b == 0 || (dif + a * cnt) % b == 0) {
return Math.abs(cnt); // 返回绝对值,确保非负
}
cnt++; // 尝试更大的 cnt
}
}
/**
* 输出结果
* @param result 计算得到的结果
*/
private static void printResult(int result) {
System.out.println(result); // 打印结果
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
C++解法
- 解题思路
更新中
- 1
C解法
更新中
- 1
JS解法
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// 监听输入行,处理逻辑
rl.on("line", (line) => {
// 解析输入的 s, t, a, b
const [s, t, a, b] = line.split(" ").map(Number);
// 调用函数计算最小的 x 值并输出结果
console.log(findMinimumX(s, t, a, b));
});
/**
* 计算最小的 x 值,使得 (t - s - a * x) 或 (t - s + a * x) 是 b 的倍数
*
* @param {number} s 起始值
* @param {number} t 目标值
* @param {number} a 步长 a
* @param {number} b 步长 b 的倍数
* @returns {number} 最小的非负整数 x
*/
function findMinimumX(s, t, a, b) {
// 计算目标差值
let diff = t - s;
// 初始化 x 为 0
let x = 0;
// 枚举 x
while (true) {
// 检查是否满足条件:正向使用 a
let positiveX = (diff - a * x) / b;
// 检查是否满足条件:反向使用 a
let negativeX = (diff + a * x) / b;
// 如果满足任意条件,返回 x
if (Number.isInteger(positiveX) || Number.isInteger(negativeX)) {
return Math.abs(x); // 确保返回非负整数
}
// 增加 x 的值
x++;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: