蓝桥杯javaB组之幸运数字

问题描述:

哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整
数。例如 126 是十进制下的一个哈沙德数,因为 (126) 10 mod (1+2+6) = 0 ; 126
也是八进制下的哈沙德数,因为 (126) 10 = (176) 8 , (126) 10 mod (1 + 7 + 6) = 0 ;
同时 126 也是 16 进制下的哈沙德数,因为 (126) 10 = (7 e ) 16 , (126) 10 mod (7 +
e ) = 0 。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为
哈沙德数,那么这个数字就是幸运数字,第 1 至第 10 个幸运数字的十进制表示
为: 1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 . . . 。现在他想知道第 2023 个幸运数
字是多少?你只需要告诉小蓝这个整数的十进制表示即可

package 蓝桥杯;

public class day3 {
    // 哈德数是在某个固定的进位制当中
    // 可以被各位数字之和整除的正整数

    /*
     * (123)mod(1+2+6)=0
     * (126)10=(176)8,(126)10mod(176)=0
     * 在二进制、八进制、十进制、十六进制下均为哈德数,是幸运数字
     */

    public static void main(String[] args) {
        int j = 0;
        for (int i = 1; i < 10000000; i++) {
            // 检查i是否为哈德数,并计算哈德数的个数
            if (check(i)) {
                j++;
                // 当哈德数个数为2023时,输出该哈德数并结束循环
                if (j == 2023) {
                    System.out.println(i);
                    break;
                }
            }
        }
    }

    // 检查一个数是否是哈德数
    public static boolean check(int n) {
        // 十进制
        int sum = 0;
        int x = n;
        while (x != 0) {
            sum += x % 10; // 计算各位数字之和
            x /= 10;
        }
        if (n % sum != 0) // 若不整除返回false,否则继续检查其他进制下的情况
            return false;

        // 二进制
        sum = 0;
        x = n;
        while (x != 0) {
            sum += x % 2; // 计算各位数字之和
            x /= 2;
        }
        if (n % sum != 0) // 若不整除返回false,否则继续检查其他进制下的情况
            return false;

        // 八进制
        sum = 0;
        x = n;
        while (x != 0) {
            sum += x % 8; // 计算各位数字之和
            x /= 8;
        }
        if (n % sum != 0) // 若不整除返回false,否则继续检查其他进制下的情况
            return false;

        // 十六进制
        int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
        sum = 0;
        x = n;
        while (x != 0) {
            sum += (arr[x % 16]); // 计算各位数字之和
            x /= 16;
        }
        if (n % sum != 0) // 若不整除返回false
            return false;

        return true; // 若整除返回true,说明n是哈德数
    }
}


————————————————
版权声明:本文为CSDN博主「小羊不会飞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_55858611/article/details/130029775

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值