B: 幸运数字

81 阅读1分钟

题目描述:

image.png

题目链接:

www.lanqiao.cn/problems/34…

题目思路:

直接调用 java 内部 API 或者手写进制转换,再进行逐位求和,暴力判断到 2023 的结束。 答案:215040

算法标签: 模拟,找规律

Code:

/*
* 解法 1:
* 利用 api
*/
public class Main {
    public static void main(String[] args) {
        int cnt = 0;    //记录成立个数
        int num = 1;    //判断数字
        while (true){
            if(isB(num) && isO(num) && isD(num) && isH(num)){//2, 8, 10, 16 进制判断
                cnt++;
            }
            if(cnt == 2023){ // 到 2023 个成立的数输出并退出
                System.out.println(num);
                break;
            }
            num++;
        }
    }
    public static boolean isD(int num){
        int sum = 0;
        int t = num;
        while (t != 0){
            sum += t % 10;
            t /= 10;
        }
        return num % sum == 0;
    }
    public static boolean isB(int num){
        int sum = 0;
        String t = Integer.toBinaryString(num); // api 转换后是 String 类型需要用字符串操作
        for(int i = 0; i < t.length(); i++){
            sum += t.charAt(i) - '0';
        }
        return num % sum == 0;
    }
    public static boolean isO(int num){
        int sum = 0;
        String t = Integer.toOctalString(num);
        for(int i = 0; i < t.length(); i++){
            sum += t.charAt(i) - '0';
        }
        return num % sum == 0;
    }
    public static boolean isH(int num){
        int sum = 0;
        String t = Integer.toHexString(num);
        for(int i = 0; i < t.length(); i++){
            if(t.charAt(i) >= 'a'){
                sum += t.charAt(i) - 'a' + 10;  // 字母情况特殊判断
            }else{
                sum += t.charAt(i) - '0';
            }
        }
        return num % sum == 0;
    }
}
/*
* 解法 2:
* 手写进制转换判断
*/
public class Main {
    public static void main(String[] args) {
        int cnt = 0;
        int num = 1;
        while (true) {
            if (check(2, num) && check(8, num) && check(10, num) && check(16, num)) {
                cnt++;
            }
            if (cnt == 2023) {
                System.out.println(num);
                break;
            }
            num++;
        }
    }
    public static boolean check(int base, int num){ // 进制位, 转换数
        int t = num;
        int sum = 0;
        while (t != 0){
            sum += t % base;
            t /= base;
        }
        return num % sum == 0;
    }
}

注:第 14 届 蓝桥杯 java b组 省赛