Java编程那些事儿39—流程控制综合示例1
郑州游戏学院陈跃峰
5.6 综合示例
在一般的学校学习流程控制时,重点是放在流程控制的相关语法,其实为了能成为一个合格的程序员,仅仅学好语法是远远不够的,还需要通过大量的练习来适应程序设计语言的思维方式,并且熟练地把自己的解决问题的步骤形成代码,这些都需要通过大量的阅读代码和编写代码来实现。
所以在学习流程控制时,重点是解决实际的问题,而不是仅仅停留在语法层面上,这个是很多在校学生学习程序时最突出的一个问题。
在遇到一个实际问题时,首先要能够思考出解决这个问题的数学步骤或逻辑步骤,然后才能编写对应的代码,所以遇到实际问题是,一定要积极思考,并且善于思考,对于一个相同的问题,不同的逻辑就可以写出不同的代码,所以在思考解决问题的方式时,需要进行发散性的思维,而这些理性的思维很多都是建立在数学基础以及对语法的熟悉基础之上。
下面,通过一系列的实际问题,来说明解决实际问题的步骤以及书写的对应的代码。
5.6.1 示例讲解
5.6.1.1 最大公约数
问题:求两个自然数的最大公约数。
这两个都是基础的数学问题,最大公约数指两个数字公共的约数中最大的,例如数字6的约数有1、2、3、6,数字9的约数有1、3、9,则数字6和数字9的公共约数有1和3,其中3是最大的公约数。
第一种思路:从1开始循环,每次把符合要求(即同时是两个数字的约数)的值都存储起来,那么最后一个存储起来的就是最大的约数。
则实现的代码如下:
int n = 6;
int m = 9;
int result = 1;
for(int i = 1;i <= n;i++){
if((n % i == 0) && (m % i == 0)){
result = i;
}
}
System.out.println(result);
使用该思路,每次都存储得到的公共约数,那么最后一个存储的就是两个数字的最大公约数。
第二种思路:从两个数字中最小的数字开始循环,每次减1,那么第一次得到的公共约数就是所求的最大公约数。
则实现的代码如下:
int n = 6;
int m = 9;
int result = n > m ?m : n;
for(int i = result;i >= 1;i--){
if((n % i == 0) && (m % i == 0)){
result = i;
break;//结束循环
}
}
System.out.println(result);
当然,解决这个问题,还有很多其它的方法,这里演示的这两种实现只是最自然的实现而已,采用类似的原理也可以求两个数字的最小公倍数的结构。
5.6.1.2 百元百鸡问题
问题描述:每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?说明:每种鸡的数量都可以为零。
其实这个问题是数学上的组合问题,只需要把所有的情况列举出来,然后来判断是否符合要求即可。这样的重复列举的问题,在程序上可以使用循环进行解决。
第一种思路:当母鸡的数量为0时,公鸡的数量从0-100,当公鸡的数量每变化一次,小鸡的数量就从0变化到100,使用如下数值组合来描述这个思路:
母鸡数量
公鸡数量
小鸡数量
0 0 从0变化到100
0 1 从0变化到100
0 2 从0变化到100
……
1 0 从0变化到100
1 1 从0变化到100
……
100 100 100
上面列举出了所有公鸡、母鸡和小鸡的数量都是0-100时的所有组合,总计是101的三次方种,这样的穷举结构直接存在嵌套,在程序实际实现时,通过循环之间的嵌套就可以实现,则实现的代码如下:
for(int i = 0;i <= 100;i++){//母鸡数量
for(int j = 0;j <= 100;j++){ //公鸡数量
for(int k = 0;k <= 100;k++){ //小鸡数量
//判断数量是否为100,以及金额是否为100
if((i +j + k == 100) && (i * 3 + j * 4 + k * 0.5 == 100)){
System.out.println(“母鸡数量:” + i + “ 公鸡数量:” + j + “ 小鸡数量” + k);
}
}
}
}
按照for语句的执行流程,循环变量变化1,则内部的循环执行一次,而在循环嵌套时,循环体又是一个新的循环,则该循环执行完成的一组循环。这里通过循环的嵌套实现了所有数值的穷举。在循环的内部,只需要按照题目要求判断一下数量和金额是否符合要求即可。
但是这样的代码效率比较差,可以通过简单的优化来提高程序的执行效率。
第二种思路:由于母鸡每只的金额是3元,所以100元最多购买的母鸡数量是100/3=33只,同理100元最多购买的公鸡数量是25只,而按照100元100只的要求,小鸡的数量应该为100减去公鸡和母鸡的数量,这样代码就可以简化为如下的结构:
for(int i = 0;i <= 33;i++){//母鸡数量
for(int j = 0;j <= 25;j++){ //公鸡数量
int k = 100 –i – j;//小鸡数量
//判断金额是否为100
if (i * 3 + j * 4 + k * 0.5 == 100){
System.out.println(“母鸡数量:” + i + “ 公鸡数量:” + j + “ 小鸡数量” + k);
}
}
}
}
这样,就可以大幅提高程序的执行效率,从而提高程序的执行速度。当然该代码还可以继续进行优化,那样可以再次提供程序的执行效率。