【基础算法】枚举

一、枚举思想

枚举法,也称穷举法,是指在解决问题的时候穷举每一种可能的情况,最终得到符合要求的答案。枚举法的效率并不高,但适用于一些没有明显规律可循的场景。

枚举的算法思想:在解决某些问题时,可能没有办法按一定规律从众多候选答案中找到正确的解。这时,可将所有候选答案逐一列出,并验证该候选答案是否为正确的解。将所有候选答案验证以后就可以找出正确的解(或无解),这就是枚举思想。

 

二、枚举的实现

枚举一般会通过循环遍历和 if 判断来实现。首先分析问题的对象、范围和判断条件,然后逐一列出所有可能的解,判断是否符合要求。代码结构通常如下:

for(i = x1; i < x2; i++){
    for(j = y1; j < y2; j++){
        if(i,j 满足条件){
            输出正确答案
        }
    }
}

 

示例:输出所有水仙花数。水仙花数是指一个三位数,其各位数字的立方之和等于它本身,例如 153 是一个水仙花数,因为 153 = 13 + 53 + 33

水仙花数是三位数,那么它的范围为 [100, 999],条件限制为各位数字的立方之和等于它本身。代码如下:

/**
 * 输出水仙花数
 */
public static void narcissusNumber() {
    for (int i = 100; i < 1000; i++) {
        int a = i % 10; // 个位数
        int b = (i / 10) % 10; // 十位数
        int c = (i / 100); // 百位数
        if (a * a * a + b * b * b + c * c * c == i) {
            System.out.println(i);
        }
    }
}

上面的代码是遍历 [100, 999] 之间的所有数字,拆出每个数字的个位、十位、百位。也可以换种思路,[100, 999] 之间的数字,百位数字的范围是 [1, 9],十位、个位数字的范围是 [0, 9],可以用各位数字组装得到一个三位数。代码如下:

/**
 * 输出水仙花数
 */
public static void narcissusNumber() {
    for (int i = 1; i <= 9; i++) { // 百位数
        for (int j = 0; j <= 9; j++) { // 十位数
            for (int k = 0; k <= 9; k++) { // 个位数
                int num = i * 100 + j * 10 + k;
                if (i * i * i + j * j * j + k * k * k == num) {
                    System.out.println(num);
                }
            }
        }
    }
}

 

posted @ 2023-10-29 23:40  有点成长  阅读(207)  评论(0编辑  收藏  举报