首页 > 编程知识 正文

简单的枚举法例题及解法,枚举算法求解问题的过程

时间:2023-05-06 20:58:33 阅读:195865 作者:4876

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

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。