华为OD机试真题——新工号中数字的最短长度(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《新工号中数字的最短长度》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C++
C
GO
题目名称:新工号中数字的最短长度
- 知识点:数学(对数计算/二分法)
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
3020年,空间通信集团的员工人数突破20亿人,即将遇到现有工号不够用的窘境。现在,请你负责调研新工号系统。继承历史传统,新的工号系统由小写英文字母(a-z)和数字(0-9)两部分构成。新工号由一段英文字母开头,之后跟随一段数字,例如aaahw0001
、a12345
、abcd1
、a00
。
注意:
- 新工号不能全为字母或全为数字。
- 数字部分允许有前导0或全为0。
- 过长的工号会增加记忆成本,现给定需要分配的工号数量
X
(0 < X ≤ 2^50 – 1
)和字母部分的长度Y
(0 < Y ≤ 5
),求数字部分的最短长度Z
。
输入描述
一行两个非负整数X Y
,用空格分隔。
输出描述
输出数字部分的最短长度Z
。
示例
- 输入:
260 1
,输出:1
- 输入:
26 1
,输出:1
(数字长度不能为0) - 输入:
2600 1
,输出:2
解题思路
数学问题,需满足26^Y * 10^Z ≥ X
,通过二分法或对数计算求解最小Z
。
Java
问题分析
题目要求确定新工号系统中数字部分的最短长度Z,使得工号数量满足要求。工号由字母和数字组成,不能全为字母或数字。给定工号需求数量X和字母长度Y,需找到最小的Z使得26^Y * 10^Z ≥ X且Z≥1。
解题思路
- 数学计算:利用对数和二分法求解满足条件的最小Z。
- 处理大数:使用
BigInteger
处理大数运算,避免溢出。 - 边界条件:确保Z≥1,即使当26^Y ≥X时,也需保证数字部分存在。
代码实现
import java.math.BigInteger;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String[] parts = scanner.nextLine().split(" ");BigInteger X = new BigInteger(parts[0]);int Y = Integer.parseInt(parts[1]);// 计算字母部分的总数A = 26^Ylong A = (long) Math.pow(26, Y);BigInteger aBig = BigInteger.valueOf(A);// 计算所需的最小数字部分数量required = ceil(X/A)BigInteger required = X.add(aBig.subtract(BigInteger.ONE)).divide(aBig);int Z;if (required.compareTo(BigInteger.ONE) <= 0) {// 当required<=1时,Z必须至少为1Z = 1;} else {// 计算required的十进制位数kint k = required.toString().length();int zCandidate = k - 1;BigInteger tenPower = BigInteger.TEN.pow(zCandidate);if (tenPower.compareTo(required) >= 0) {Z = zCandidate;} else {Z = zCandidate + 1;}// 确保Z至少为1Z = Math.max(Z, 1);