枚举算法例题

枚举算法:一一列举问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解。

枚举时注意:不遗漏,不重复,且可能的解有限。

枚举算法把问题分解成二部分:

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,并且乘除的优先级高于加减的优先级。



转载于:https://juejin.im/post/5c526d2d518825551e288c61

你可能感兴趣的:(枚举算法例题)