枚举算法:一一列举问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解。
枚举时注意:不遗漏,不重复,且可能的解有限。
枚举算法把问题分解成二部分:
1.一一列举:
循环结构。考虑的问题:如何设置循环变量,初值,终值,递增值,循环变量是否参与检验。
2.检验:
分支结构。考虑的问题:检验对象是谁,逻辑判断后的2个结果该如何处理。
注意:循环变量与判断对象是否是同一个变量。
该算法的输入和输出处理:大部分情况是利用循环变量来代替。
例1.求1-1000中能被3整除的数。
//求1-1000中,能被3整除的数
public class Enum02 {
public static void main(String args[]) {
int sum = 0;
for(int i = 1;i <= 1000; i++){
if(i % 3 == 0) {
System.out.println("能被3整除的数有:"+i);
sum = sum + 1;
}
}
System.out.println("能被3整除的数的个数是:"+sum);
}
}
复制代码
例2.找出1-1000中所有能被7和11整除的数。
//1-1000中能被7和11整除的数
public class Enum03 {
public static void main(String args[]) {
int sum = 0;
for(int i = 1; i <= 1000; i++) {
if(i % 7 == 0 && i % 11 == 0) {
System.out.println("能被7和11整除的数有:"+ i);
sum = sum + 1;
}
}
System.out.println("能被7和11整除的数有"+sum+"个。");
}
} 复制代码
例3.推算单据中被涂抹的数字。
(涂抹一个数字)
1. 某单据2545x缺个位数,但知道这个5位数是37或67的倍数,请设计一个算法,输出所有满足条件的五位数,并统计这样的数的个数。
- 对这个五位数直接列举,然后进行检验。
- 列举个位数上的数字,然后对这个五位数用表达式表达,最后进行检验。
public class Enum04 {
public static void main(String args[]) {
int sum = 0;
for(int n = 25450; n <= 25459; n++) {
if(n % 37 == 0 && n % 67 == 0) {
sum = sum + 1;
System.out.println("满足条件的五位数是:"+n);
}
}
System.out.println("满足条件的数的个数是:"+sum);
}
}
复制代码
//列举个位数上的数字,然后对这个五位数用表达式表达,最后进行检验。
public class Enum0401 {
public static void main(String args[]) {
int sum = 0;
for(int i = 0;i <= 9; i++) {
int n = 25450 + i; //表达式
if(n % 37 == 0 || n % 67 == 0) {
System.out.println("满足条件的五位数是:"+n);
sum = sum + 1;
}
}
System.out.println("满足条件的五位数有"+sum+"个。");
}
}
复制代码
(涂抹相邻的两个数字)
2. 某单据1xx47,缺千位数和百位数,但这个5位数是57或67的倍数,请设计一个算法,输出所有满足条件的5位数,并统计这样的数的个数。
//某单据1xx47,缺千位数和百位数,但这个5位数是57或67的倍数,请设计一个算法,输出所有满足条件的5位数,并统计这样的数的个数。
public class Enum0402 {
public static void main(String args[]) {
int sum = 0;
for(int i = 0; i<= 99; i++) {
int n = 10047 + i * 100;//5位数的表达式
if(n % 57 == 0 || n % 67 == 0) {
System.out.println("满足条件的五位数是:"+n);
sum = sum + 1;
}
}
System.out.println("满足条件的五位数有"+sum+"个。");
}
}
复制代码
(涂抹不相邻的两个数字)
3. 某单据1x4x7,缺千位数和十位数,但这个5位数是57或67的倍数,请设计一个算法,输出所有满足条件的5位数,并统计这样的数的个数。
public class Enum0403 {
public static void main(String args[]) {
int sum = 0;
for(int n = 0;n <= 9; n++){
for(int m = 0;m <= 9; m++) {
int k = 10407 + n * 1000 + m * 10;//表达式
if(k % 57 == 0 || k % 67 == 0) {
System.out.println("满足条件的五位数是:"+k);
sum = sum + 1;
}
}
}
System.out.println("满足条件的五位数有"+sum+"个。");
}
}复制代码
例4. 输出1000以内的素数。
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。1和0既非素数也非合数。
只需要每次取出一个数,然后把这个数依次除以从2到它本身,看余数,如果余数有0的情况,那么一定不是素数,如果全部除完了发现都没有余数为0的情况,那么一定是素数。
偶数肯定不是素数,所以递增的时候可以以奇数的形式递增,再在奇数中去掉非质数的数。
public class Enum05 {
public static void main(String args[]) {
int sum = 0;
int i = 0;
int j = 0;
for(i = 3;i <= 1000; i = i+2) {
for( j = 2; j < i; j++) {
if(i % j == 0) {
break;
}
}
if(i == j) {
System.out.println("素数--------"+i);
sum = sum + 1;
}
}
System.out.println("1-1000内的素数有"+sum+"个。");
}
}
复制代码
例5. 找水仙花数
输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身,例如153是“水仙花数”,因为:153 = 13 + 53 + 33。
public class Enum06 {
public static void main(String args[]) {
int g = 0; //个位数字
int s = 0; //十位数字
int b = 0; //百位数字
int sum = 0;
for(int i = 100;i <= 999; i++) {
b = i / 100;
g = i % 10;
s = (i - b*100)/10;
if(i == (b*b*b + s*s*s + g*g*g)) {
System.out.println("水仙花数---------"+i);
sum = sum + 1;
}
}
System.out.println("水仙花数有"+sum+"个。");
}
}
复制代码
例6. 鸡兔同笼问题
今有鸡兔同笼,上有三十五头,下有九十四足。问鸡兔各几只?
public class Enum07 {
public static void main(String args[]) {
//方法一
for(int j = 0;j <= 35;j++){
if(94 == 2*j + 4*(35-j)) {
int t = 35 - j;
System.out.println("鸡有-----"+j+"只----兔有----"+t+"只。");
}
}
//方法二
for(int j = 0;j <= 35; j++) {
for(int t = 0; t <=35; t++) {
if((j + t == 35) && (2*j + 4*t == 94)) {
System.out.println("鸡有-----"+j+"只----兔有----"+t+"只。");
}
}
}
}
}
复制代码
例7. 百鸡百钱问题。
鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何?
公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?
public class Enum08 {
public static void main(String args[]) {
for(int g = 0;g <= 20; g++) {
for(int m = 0;m <= 33; m++) {
int x = 100 - g - m;
if((5*g + 3*m +x/3 == 100)) {
System.out.println("公鸡有----"+g+"只,母鸡有------"+m+"只,小鸡有-----"+x+"只。");
}
}
}
}
} 复制代码
例8. 使用枚举法解决“填写运算符问题”
1,问题描述:在下面的算式中,添加“+”、“-”,“*”,“/”,4个运算符,使得这个式子成立。 5 5 5 5 5=5
2,算法分析: 上述式子左侧有5个数字,一共需要4个运算符。根据题目要求,两个数字之间的运算符只能有4中选择。在 具体编程时,可以通过循环来填入各种运算符,然后再判断算式左侧的值是否等于右侧的值。并保证,当填入的 是除号时,则右侧的数不能为0,并且乘除的优先级高于加减的优先级。