2023年第十四届蓝桥杯JavaB组省赛真题(B、幸运数字)

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 个幸运数 字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
二、思路分析
  1. main 方法中,首先初始化一个计数器 count 为 10,用于记录找到的 Harshad 数的数量。从整数 127 开始,进入一个无限循环。
  2. 在循环中,逐个检查当前整数 i 是否在 2、8、10、16 进制下都是 Harshad 数,即调用 isHarshad 方法进行判断。
  3. 如果当前整数是一个符合条件的 Harshad 数,则计数器 count 加一,同时判断是否为第 2023 个 Harshad 数,如果是则输出该数并结束程序。
  4. 如果不是第 2023 个 Harshad 数,则继续循环检查下一个整数。
  5. isHarshad 方法中,根据给定进制计算整数的各位数字之和,并判断是否为 Harshad 数。
  6. 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; // 返回各位数字之和
    }
不足之处,请留言指教
  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值