华为OD机试 2024D卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有位客人来自异国,在该国使用m进制计数。
该客人有个幸运数字n(n<m),每次购物时,其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。
问: 当其购买一个在我国价值k的产品时,其中包含多少幸运数字?
二、输入描述
第一行输入为 k,n,m。其中:
k 表示 该客人购买的物品价值 (以十进制计算的价格)
n 表示该客人的幸运数字
m 表示 该客人所在国度的采用的进制
三、输出描述
输出幸运数字的个数,行未无空格。
1、输入
10 2 4
2、输出
2
3、说明
10用4进制表示时为22,同时,异国客人的幸运数字是2,故而此处输出为2,表示有2个幸运数字。
四、解题思路
我们需要将十进制数 k 转换为 m 进制,然后统计其中等于幸运数字 n 的个数。具体步骤如下:
- 将十进制数 k 转换为 m 进制:
- 使用除基取余法,直到 k 为0,将每次的余数记录下来。
- 将记录的余数反向排列,即为 m 进制表示。
- 统计幸运数字的个数:
- 遍历 m 进制表示的数字,统计其中等于 n 的数字个数。
- 输出结果:输出幸运数字的个数。
五、Java算法源码
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的 k, n, m
int k = scanner.nextInt();
int n = scanner.nextInt();
int m = scanner.nextInt();
// 关闭Scanner
scanner.close();
// 将十进制数 k 转换为 m 进制
String mBaseNumber = convertToBaseM(k, m);
// 统计幸运数字 n 的个数
int luckyNumberCount = countLuckyNumbers(mBaseNumber, n);
// 输出结果
System.out.println(luckyNumberCount);
}
// 将十进制数 k 转换为 m 进制表示
private static String convertToBaseM(int k, int m) {
StringBuilder mBaseNumber = new StringBuilder();
while (k > 0) {
int remainder = k % m;
mBaseNumber.append(remainder);
k /= m;
}
return mBaseNumber.reverse().toString();
}
// 统计 m 进制表示中幸运数字 n 的个数
private static int countLuckyNumbers(String mBaseNumber, int n) {
int count = 0;
char luckyDigit = Character.forDigit(n, 10);
for (char digit : mBaseNumber.toCharArray()) {
if (digit == luckyDigit) {
count++;
}
}
return count;
}
}
六、效果展示
1、输入
10 4 4
2、输出
0
3、说明
此时客人的幸运数字为4,但是由于该国最大为4进制,故而在该国的进制下不可能出现幸运数字,故而返回0
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。