【基础算法】枚举
一、枚举思想
枚举法,也称穷举法,是指在解决问题的时候穷举每一种可能的情况,最终得到符合要求的答案。枚举法的效率并不高,但适用于一些没有明显规律可循的场景。
枚举的算法思想:在解决某些问题时,可能没有办法按一定规律从众多候选答案中找到正确的解。这时,可将所有候选答案逐一列出,并验证该候选答案是否为正确的解。将所有候选答案验证以后就可以找出正确的解(或无解),这就是枚举思想。
二、枚举的实现
枚举一般会通过循环遍历和 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);
}
}
}
}
}
本文来自博客园,作者:有点成长,转载请注明原文链接:https://www.cnblogs.com/luwei0424/p/17796790.html