2023年第十四届蓝桥杯JavaB组省赛真题(B、幸运数字)
一、题目内容
题目描述:
哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整 数。例如 126 是十进制下的一个哈沙德数,因为 (126)10 mod (1+2+6) = 0;126也是八进制下的哈沙德数,因为 (126)10 = (176)8,(126)10 mod (1 + 7 + 6) = 0; 同时 126 也是 16 进制下的哈沙德数,因为 (126)10 = (7e)16,(126)10 mod (7 + e) = 0。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为 哈沙德数,那么这个数字就是幸运数字,第 1 至第 10 个幸运数字的十进制表示 为:1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 . . . 。现在他想知道第 2023 个幸运数 字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
二、思路分析
- 在
main
方法中,首先初始化一个计数器count
为 10,用于记录找到的 Harshad 数的数量。从整数 127 开始,进入一个无限循环。 - 在循环中,逐个检查当前整数
i
是否在 2、8、10、16 进制下都是 Harshad 数,即调用isHarshad
方法进行判断。 - 如果当前整数是一个符合条件的 Harshad 数,则计数器
count
加一,同时判断是否为第 2023 个 Harshad 数,如果是则输出该数并结束程序。 - 如果不是第 2023 个 Harshad 数,则继续循环检查下一个整数。
- 在
isHarshad
方法中,根据给定进制计算整数的各位数字之和,并判断是否为 Harshad 数。 - 在
getSumDigits
方法中,实现了计算一个整数在特定进制下各位数字之和的逻辑。
三、代码实现
public static void main(String[] args) {
int count = 10; // 初始化计数器为 10,用于跟踪 Harshad 数的数量
for (int i = 127; ; i++) {
// 从整数 127 开始逐个检查更大的整数,以寻找符合特定条件的 Harshad 数
if (isHarshad(i, 2) && isHarshad(i, 8) && isHarshad(i, 10) && isHarshad(i, 16)) {
// 如果当前整数 i 在 2、8、10、16 进制下都是 Harshad 数
count++; // 计数器加一
if (count == 2023) { // 当计数器达到 2023 时,即找到第 2023 个 Harshad 数
System.out.println(i); // 输出该 Harshad 数
break; // 跳出循环
}
}
}
}
public static boolean isHarshad(int num, int base) {
// 判断一个整数在给定进制下是否为 Harshad 数的方法
int sumDigits = getSumDigits(num, base); // 计算给定进制下各位数字之和
return num % sumDigits == 0; // 若整数能被其各位数字之和整除,则为 Harshad 数
}
public static int getSumDigits(int num, int base) {
// 计算一个整数在特定进制下各位数字之和的方法
int sumDigits = 0; // 初始化各位数字之和为 0
while (num > 0) {
sumDigits += num % base; // 将当前位数字加到总和中
num /= base; // 去掉当前位数字,继续计算下一位数字
}
return sumDigits; // 返回各位数字之和
}